Addition of 'Last Updated' tag
[planet-ucc.git] / XMLWriter.py
1 #
2 # XMLWriter.py
3 #
4 # Generate arbitrary XML files
5 #
6 # (c) 2004, Davyd Madeley <[email protected]>
7 #
8
9 import time
10
11 class PlanetItem:
12         def __init__(self, blog, item):
13                 self.itemTitle  = item.itemTitle
14                 self.itemURL    = item.itemURL
15                 self.itemDate   = item.itemDate
16                 self.blogTitle  = blog.blogTitle
17                 self.blogURL    = blog.blogURL
18                 self.imageURL   = blog.imageURL
19                 self.imageLink  = blog.imageLink
20                 self.contents   = item.contents
21
22 class PlanetDate:
23         def __init__(self, date):
24                 self.planetDate = date
25                 self.items      = []
26
27 class Planet:
28         def __init__(self, bloglist):
29                 self.__bloglist__       = bloglist
30                 self.__tainted__        = True
31                 self.dates              = []
32                 
33         def append(self, blog):
34                 self.__bloglist__.append(blog)
35                 self.__tainted__        = True
36         
37         def __getNext__(self, bloglist):
38                 "Returns a PlanetItem reaped from a bloglist"
39                 latestTime              = 0
40                 holdingBlog             = None
41                 for blog in bloglist:
42                         if len(blog.items) > 0 and blog.items[0].itemDate > latestTime:
43                                 latestTime      = blog.items[0].itemDate
44                                 holdingBlog     = blog
45                 if holdingBlog == None:
46                         return None
47                 item    = holdingBlog.items.pop(0)
48                 return PlanetItem(holdingBlog, item)
49         
50         def sort(self):
51                 if self.__tainted__:
52                         # we need to sort the blogs into a single news feed
53                         # copy the bloglist to a working symbol
54                         bloglist        = self.__bloglist__ + []
55                         lastDate        = -1
56                         workingDate     = None
57                         self.dates      = []
58                         while True:
59                                 lastItem        = self.__getNext__(bloglist)
60                                 if lastItem == None:
61                                         break
62                                 # this checks to see if it's a new day
63                                 if time.localtime(lastItem.itemDate)[6] != lastDate:
64                                         lastDate        = time.localtime(lastItem.itemDate)[6]
65                                         workingDate     = PlanetDate(lastItem.itemDate)
66                                         self.dates.append(workingDate)
67                                 # append the item to the current date
68                                 workingDate.items.append(lastItem)      
69                         self.__tainted__        = False
70                 return self.dates
71                         
72
73 class XMLWriter:
74         def __init__(self, doctype, bloglist):
75                 self.blogs      = bloglist
76                 self.planet     = Planet(bloglist)
77                 self.items      = self.planet.sort()
78                 # doctype should be something like XMLWriter.XHTMLWriter
79                 self.writer             = doctype(self.items)
80                 self.writer.parent      = self
81         
82         def write(self):
83                 output          = self.writer.write()
84                 return output
85
86 class XHTMLWriter:
87         def __init__(self, planet):
88                 self.planet     = planet
89                 self.maxitems   = 50
90                 self.parent     = None
91         
92         def __write_item__(self, item):
93                 output  =       ''
94                 output  +=      '<div id="item">\n'
95                 output  +=      '<h2>%s: %s</h2>\n' % (item.blogTitle, item.itemTitle)
96                 output  +=      '<p class="time">\n'
97                 if item.imageURL:
98                         output += '<a class="image" href="%s"><img class="image" src="%s" alt="%s" /></a>\n' % (item.imageLink, item.imageURL, item.blogTitle)
99                 output  +=      '(<a href="%s">%s</a>)\n' % (item.itemURL ,time.strftime('%A %B %d, %Y %H:%M %Z', time.localtime(item.itemDate)))
100                 output  +=      '</p>\n'
101                 output  +=      '<p class="body">\n'
102                 output  +=      item.contents
103                 output  +=      '\n</p>\n'
104                 output  +=      '</div>'
105                 return output
106         
107         def write(self):
108                 itemcount       = 0
109                 output  =       ''
110                 output  +=      '<?xml version="1.0" encoding="UTF-8"?>\n'
111                 output  +=      '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n'
112                 output  +=      '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >\n'
113                 output  +=      '<head>\n'
114                 output  +=      '<title>Planet UCC</title>\n'
115                 output  +=      '<link rel="stylesheet" href="planet.css" type="text/css" media="screen" />\n'
116                 output  +=      '<link rel="icon" type="image/png" href="icon.png" />\n'
117                 output  +=      '</head>\n'
118                 output  +=      '<body>\n'
119                 output  +=      '<div id="header">\n'
120                 try:
121                         output  +=      open('header.html').read()
122                 except:
123                         pass
124                 output  +=      '</div>\n'
125                 output  +=      '<div id="sidebar">\n'
126                 try:
127                         output  +=      open('sidebar.html').read()
128                 except:
129                         pass
130                 output  +=      '<h2>Last Updated</h2>\n'
131                 output  +=      '<p>\n'
132                 output  +=      '%s\n' % time.strftime('%A %B %d, %Y %H:%M', time.localtime())
133                 output  +=      '</p>\n'
134                 if self.parent:
135                         output  +=      '<h2>Feeds</h2>\n'
136                         output  +=      '<p>\n'
137                         for blog in self.parent.blogs:
138                                 output  += '<a href="%s">%s</a><br />\n' % (blog.blogURL, blog.blogTitle)
139                         output  +=      '</p>\n'
140                 output  +=      '</div>\n'
141                 output  +=      '<div id="items">\n'
142                 for date in self.planet:
143                         output  += '<h1>%s</h1>\n' % time.strftime('%A %B %d, %Y', time.localtime(date.planetDate))
144                         for item in date.items:
145                                 output  += self.__write_item__(item)
146                                 # see how many items we've written
147                                 itemcount += 1
148                                 if itemcount >= self.maxitems:
149                                         break
150                         # again, check to see if we've written the maximum number of items
151                         if itemcount >= self.maxitems:
152                                 break
153                 output  +=      '</div>\n'
154                 output  +=      '<div id="footer">\n'
155                 try:
156                         output  +=      open('footer.html').read()
157                 except:
158                         pass
159                 output  +=      '</body>\n'
160                 output  +=      '</html>'
161                 return output

UCC git Repository :: git.ucc.asn.au