summaryrefslogtreecommitdiff
path: root/site_builder/feeds.py
diff options
context:
space:
mode:
Diffstat (limited to 'site_builder/feeds.py')
-rw-r--r--site_builder/feeds.py111
1 files changed, 111 insertions, 0 deletions
diff --git a/site_builder/feeds.py b/site_builder/feeds.py
new file mode 100644
index 0000000..6c38443
--- /dev/null
+++ b/site_builder/feeds.py
@@ -0,0 +1,111 @@
1# vim: set filencoding=utf8
2"""
3Atom Feed Writer
4
5@author: Mike Crute (mcrute@ag.com)
6@organization: American Greetings Interactive
7@date: June 04, 2010
8"""
9
10#from io import StringIO
11from StringIO import StringIO
12from xml.sax.saxutils import XMLGenerator
13
14
15class SimpleXMLGenerator(XMLGenerator):
16
17 def __init__(self, encoding='utf-8'):
18 self.output = StringIO()
19 XMLGenerator.__init__(self, out=self.output, encoding=encoding)
20
21 def get_contents(self):
22 return self.output.getvalue()
23
24 def startElement(self, tag, attrs=None):
25 attrs = attrs if attrs else {}
26 return XMLGenerator.startElement(self, tag, attrs)
27
28 def addElement(self, tag, contents=None, attrs=None):
29 attrs = attrs if attrs else {}
30 self.startElement(tag, attrs)
31 if contents:
32 self.characters(contents)
33 self.endElement(tag)
34
35
36class Atom1Feed(object):
37
38 def __init__(self, posts, title, feed_url, updated, blog_url,
39 post_filter=None):
40 self.posts = posts
41 self.title = title
42 self.feed_url = feed_url
43 self.updated = updated
44 self.blog_url = blog_url
45 self.handler = SimpleXMLGenerator()
46
47 if not post_filter:
48 post_filter = lambda post: True
49
50 self.post_filter = post_filter
51
52 def _format_time(self, timeobj):
53 return timeobj.strftime("%Y-%m-%dT%H:%M:%SZ")
54
55 def get_feed(self):
56 self.handler.startDocument()
57 self.handler.startElement('feed', {
58 'xmlns': 'http://www.w3.org/2005/Atom' })
59
60 self.add_root_elements()
61
62 for post in self.posts:
63 if not self.post_filter(post):
64 continue
65
66 self.add_post(post)
67
68 self.handler.endElement('feed')
69
70 return self.handler.get_contents()
71
72 def add_root_elements(self):
73 self.handler.addElement('title', self.title)
74 self.handler.addElement('updated', self._format_time(self.updated))
75 self.handler.addElement('id', self.feed_url)
76 self.handler.addElement('link', attrs={
77 'rel': 'alternate',
78 'type': 'text/html',
79 'href': self.blog_url })
80 self.handler.addElement('link', attrs={
81 'rel': 'self',
82 'type': 'application/atom+xml',
83 'href': self.feed_url })
84
85 def add_post(self, post):
86 handler = self.handler
87
88 handler.startElement('entry')
89
90 handler.startElement('author')
91 handler.addElement('name', post.author.name)
92 handler.addElement('email', post.author.email)
93 handler.endElement('author')
94
95 post_href = '{0}/{1}'.format(self.blog_url, post.filename)
96
97 handler.addElement('title', post.title)
98 handler.addElement('link', attrs={
99 'rel': 'alternate',
100 'type': 'text/html',
101 'href': post_href })
102 handler.addElement('id', post_href)
103 handler.addElement('updated', self._format_time(post.post_date))
104 handler.addElement('published', self._format_time(post.post_date))
105
106 for tag in post.tags:
107 handler.addElement('category', attrs={ 'term': tag })
108
109 handler.addElement('content', post.contents, attrs={ 'type': 'html' })
110
111 handler.endElement('entry')