summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGunnar Wrobel <wrobel@gentoo.org>2005-07-24 14:51:50 +0000
committerGunnar Wrobel <wrobel@gentoo.org>2005-07-24 14:51:50 +0000
commitab519ec8dd7f33784bdae57ccd5cbf01d0c2dc2a (patch)
treefa1858acb4c2c4e399719026a23ac4060700e935 /www-apps/pyblosxom-plugins/files
parentFixed digests (diff)
downloadoverlay-ab519ec8dd7f33784bdae57ccd5cbf01d0c2dc2a.tar.gz
overlay-ab519ec8dd7f33784bdae57ccd5cbf01d0c2dc2a.tar.bz2
overlay-ab519ec8dd7f33784bdae57ccd5cbf01d0c2dc2a.zip
Added rss2 renderer plugin
svn path=/; revision=158
Diffstat (limited to 'www-apps/pyblosxom-plugins/files')
-rw-r--r--www-apps/pyblosxom-plugins/files/rss2renderer.py234
-rw-r--r--www-apps/pyblosxom-plugins/files/rss2renderer.py.html251
2 files changed, 485 insertions, 0 deletions
diff --git a/www-apps/pyblosxom-plugins/files/rss2renderer.py b/www-apps/pyblosxom-plugins/files/rss2renderer.py
new file mode 100644
index 0000000..ff73c64
--- /dev/null
+++ b/www-apps/pyblosxom-plugins/files/rss2renderer.py
@@ -0,0 +1,234 @@
+"""
+The rss2renderer is a renderer that will render your blog in RSS2
+format. This allows you to have RSS2 syndication WITHOUT writing
+flavour templates for RSS2.
+
+The following are required properties in your config.py file:
+
+ blog_title - the title of your blog
+ blog_author - your name
+ blog_email - your email address
+ blog_description - the description of your blog
+ blog_language - the language code for your blog
+ blog_encoding - the encoding of your blog (defaults to utf-8)
+
+Optionally, you can specify:
+
+ rss2_extension - the extension (defaults to "/index.rss2") that
+ causes this renderer to be used
+
+Miscellaneous notes about this plugin:
+
+1. the Content-Type we return is "application/xml" so your links
+ should match
+2. this doesn't handle comments
+3. this plugin requires pyxml be installed
+
+FIXME - probably needs more information in this help portion!
+
+
+This code is placed in the public domain. Do with it as you will.
+
+
+Originally written by Blake Winton.
+Overhauled by Will Guaraldi.
+
+Just for clarity sake, Blake wrote the majority of the code, but Will is
+going to take responsibility to maintain the code going forward (unless
+Blake really wants to--doesn't bother Will either way).
+
+Revisions:
+1.8 - (April 11, 2005) Changed instances of roughingit to the new web-site url.
+1.7 - (March 9, 2005) Fixed problems with rss2renderer and conditionalhttp.
+1.6 - (January 28, 2005) Fixed num_entries problem with PyBlosxom 1.2 (not yet
+ released).
+1.5 - (September 27, 2004) Fixed num_entries issue with PyBlosxom 1.1.
+1.4 - (September 15, 2004) Fixed encoding issues (thanks Aslak!)
+1.3 - (September 14, 2004) Fixed the content type (thanks Gabor!)
+ Fixed spaces in the links (thanks Brett!)
+1.2 - (September 13, 2004) Fixed minor issue causing invalidation (thanks Brett!)
+1.1 - (September 12, 2004) Will's overhaul.
+1.0 - Blake's original writing.
+"""
+__author__ = "Blake Winton and Will Guaraldi"
+__version__ = "1.8 (April 11, 2005)"
+__url__ = "http://www.bluesock.org/~willg/pyblosxom/"
+__description__ = "RSS2 renderer."
+
+from Pyblosxom.renderers.base import RendererBase
+from Pyblosxom.tools import Stripper
+from xml.dom.minidom import Document
+import urlparse
+
+class RSS2Renderer(RendererBase):
+ """
+ This renderer is to create valid RSS2 documents without the need for a
+ pyblosxom template. I mostly expect you to know what you are doing, before
+ attempting this
+ """
+ # How long you want the simple description to be
+ desc_length = 20 # 20 words, at the most for me
+
+ # Create the big html? <content:encoded>, yes, then 1, else 0
+ create_entry = 1
+ entry_type = 'CDATA' # or 'escaped' - choose your poison
+
+ # Namespaces for you to pick and choose
+ namespaces = {
+ 'admin': "http://webns.net/mvcb/",
+ 'content': "http://purl.org/rss/1.0/modules/content/",
+ 'creativeCommons': "http://backend.userland.com/creativeCommonsRssModule",
+ 'dc': "http://purl.org/dc/elements/1.1/",
+ 'rdf': "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+ 'html': "http://www.w3.org/1999/html",
+ 'slash': "http://purl.org/rss/1.0/modules/slash/",
+ }
+
+ def _addText(self, element, text, baseElement):
+ e = self._doc.createElement(element)
+ e.appendChild(self._doc.createTextNode(text))
+ baseElement.appendChild(e)
+ return e
+
+ def _addCDATA(self, element, text, baseElement):
+ e = self._doc.createElement(element)
+ e.appendChild(self._doc.createCDATASection(text))
+ baseElement.appendChild(e)
+ return e
+
+ def _addElemAttr(self, element, attr, content, baseElement, text = None):
+ e = self._doc.createElement(element)
+ e.setAttribute(attr, content)
+ if text:
+ e.appendChild(self._doc.createTextNode(text))
+ baseElement.appendChild(e)
+ return e
+
+ def _addAttr(self, element, attr, content):
+ element.setAttribute(attr, content)
+
+ def _addNameSpaces(self, element, namespace_dict):
+ for attr in namespace_dict:
+ self._addAttr(element, 'xmlns:' + attr, namespace_dict[attr])
+
+ def _urlEncode(self, txt):
+ # I'm doing it here because it's only a partial url-encoding
+ txt = txt.replace(" ", "%20")
+ return txt
+
+ def _createChannel(self):
+ # Start our RSS document here
+ self._doc = Document()
+ d = self._doc
+ rss = d.createElement('rss')
+ rss.setAttribute('version', '2.0')
+ self._addNameSpaces(rss, self.namespaces)
+ d.appendChild(rss)
+ self._channel = d.createElement('channel')
+ channel = self._channel
+ rss.appendChild(channel)
+
+ # Add details about our blog here
+ self._addText('title', self._config['blog_title'], channel)
+ self._addText('link', self._urlEncode(self._config['base_url']), channel)
+ self._addText('description', self._config['blog_description'], channel)
+ self._addText('language', self._config['blog_language'], channel)
+ self._addText('ttl', '60', channel)
+ self._addText('dc:creator', self._config['blog_author'], channel)
+ self._addElemAttr('admin:generatorAgent', \
+ 'rdf:resource', \
+ 'http://pyblosxom.sourceforge.net/', \
+ channel)
+ self._addElemAttr('admin:errorReportsTo', \
+ 'rdf:resource', \
+ "mailto:" + self._config.get("blog_email", "none"), \
+ channel)
+
+ def _generateDesc(self, html):
+ s = Stripper()
+ s.feed(html)
+ str = s.gettext()
+ frag = str.split()
+ if len(frag) > self.desc_length:
+ frag = frag[:self.desc_length]
+ frag.append('...')
+ return ' '.join(frag)
+
+ def _createItem(self, entry):
+ burl = self._config['base_url']
+
+ d = urlparse.urlsplit(self._config['base_url'])
+ domain = '%s://%s' % (d[0], d[1])
+ item = self._doc.createElement('item')
+ self._channel.appendChild(item)
+ self._addText('title', entry['title'], item)
+ self._addElemAttr('guid', 'isPermaLink', 'false', item, entry['file_path'])
+ url = urlparse.urljoin(burl + "/", entry["file_path"])
+ self._addText('link', self._urlEncode(url), item)
+
+ # Text entry
+ self._addText('description', self._generateDesc(entry['body']), item)
+ if self.create_entry:
+ if self.entry_type == 'CDATA':
+ self._addCDATA('content:encoded', entry['body'], item)
+ else:
+ self._addText('content:encoded', entry['body'], item)
+ # Metadata stuff
+ # Category
+ if entry['path'].strip():
+ # category or dc:subject, but NOT both
+ self._addElemAttr('category', 'domain', domain, item, entry['path'])
+ #self._addText('dc:subject', entry['path'], item)
+ self._addText('dc:date', entry['w3cdate'], item)
+
+ def render(self, header = 1):
+ if self.rendered == 1:
+ return
+
+ self._data = self._request.getData()
+ self._config = self._request.getConfiguration()
+
+ self.addHeader('Content-Type', 'application/xml')
+ self.showHeaders()
+
+ self._createChannel()
+
+ if self._config.get("num_entries", 0):
+ max_entries = self._config["num_entries"]
+ else:
+ max_entries = 20
+
+ if self._content:
+ if max_entries > len(self._content):
+ num_entries = len(self._content)
+ else:
+ num_entries = max_entries
+
+ for count in xrange(num_entries):
+ self._createItem(self._content[count])
+
+ # We are now ready to present the xml
+
+ # FIXME this is totally hokey, but if I pass the encoding into
+ # toxml, then it tries to convert the data to the new encoding
+ # and assumes the data is ascii (which is wrong).
+ text = self._doc.toxml()
+ if self._config.has_key("blog_encoding"):
+ text = "<?xml version=\"1.0\" encoding=\"%s\" ?>" % self._config["blog_encoding"] + text[text.find("\n"):]
+
+ self.write(text)
+
+ self.rendered = 1
+
+def cb_renderer(args):
+ import sys
+ req = args['request']
+ http = req.getHttp()
+ conf = req.getConfiguration()
+
+ ext = conf.get("rss2_extension", "/index.rss2")
+ if http['PATH_INFO'].endswith( ext ):
+ http['PATH_INFO'] = http['PATH_INFO'][:-len(ext)]
+ return RSS2Renderer(req, conf.get('stdoutput', sys.stdout))
+
+# vim: tabstop=4 shiftwidth=4 expandtab
diff --git a/www-apps/pyblosxom-plugins/files/rss2renderer.py.html b/www-apps/pyblosxom-plugins/files/rss2renderer.py.html
new file mode 100644
index 0000000..a148a25
--- /dev/null
+++ b/www-apps/pyblosxom-plugins/files/rss2renderer.py.html
@@ -0,0 +1,251 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
+ "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html>
+<head><script>function PrivoxyWindowOpen(){return(null);}</script>
+<meta http-equiv="Content-Type"
+content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="GNU source-highlight 1.11
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite">
+<title>source file</title>
+<link rel="stylesheet" href="/~willg/willstyle.css" type="text/css">
+</head>
+<body>
+<pre><tt><span class="comment">"""</span>
+<span class="comment">The rss2renderer is a renderer that will render your blog in RSS2</span>
+<span class="comment">format. This allows you to have RSS2 syndication WITHOUT writing</span>
+<span class="comment">flavour templates for RSS2.</span>
+<span class="comment"></span>
+<span class="comment">The following are required properties in your config.py file:</span>
+<span class="comment"></span>
+<span class="comment"> blog_title - the title of your blog</span>
+<span class="comment"> blog_author - your name</span>
+<span class="comment"> blog_email - your email address</span>
+<span class="comment"> blog_description - the description of your blog</span>
+<span class="comment"> blog_language - the language code for your blog</span>
+<span class="comment"> blog_encoding - the encoding of your blog (defaults to utf-8)</span>
+<span class="comment"></span>
+<span class="comment">Optionally, you can specify:</span>
+<span class="comment"></span>
+<span class="comment"> rss2_extension - the extension (defaults to "/index.rss2") that</span>
+<span class="comment"> causes this renderer to be used</span>
+<span class="comment"></span>
+<span class="comment">Miscellaneous notes about this plugin:</span>
+<span class="comment"></span>
+<span class="comment">1. the Content-Type we return is "application/xml" so your links</span>
+<span class="comment"> should match</span>
+<span class="comment">2. this doesn't handle comments</span>
+<span class="comment">3. this plugin requires pyxml be installed</span>
+<span class="comment"></span>
+<span class="comment">FIXME - probably needs more information in this help portion!</span>
+<span class="comment"></span>
+<span class="comment"></span>
+<span class="comment">This code is placed in the public domain. Do with it as you will.</span>
+<span class="comment"></span>
+<span class="comment"></span>
+<span class="comment">Originally written by Blake Winton.</span>
+<span class="comment">Overhauled by Will Guaraldi.</span>
+<span class="comment"></span>
+<span class="comment">Just for clarity sake, Blake wrote the majority of the code, but Will is</span>
+<span class="comment">going to take responsibility to maintain the code going forward (unless</span>
+<span class="comment">Blake really wants to--doesn't bother Will either way).</span>
+<span class="comment"></span>
+<span class="comment">Revisions:</span>
+<span class="comment">1.8 - (April 11, 2005) Changed instances of roughingit to the new web-site url.</span>
+<span class="comment">1.7 - (March 9, 2005) Fixed problems with rss2renderer and conditionalhttp.</span>
+<span class="comment">1.6 - (January 28, 2005) Fixed num_entries problem with PyBlosxom 1.2 (not yet</span>
+<span class="comment"> released).</span>
+<span class="comment">1.5 - (September 27, 2004) Fixed num_entries issue with PyBlosxom 1.1.</span>
+<span class="comment">1.4 - (September 15, 2004) Fixed encoding issues (thanks Aslak!)</span>
+<span class="comment">1.3 - (September 14, 2004) Fixed the content type (thanks Gabor!)</span>
+<span class="comment"> Fixed spaces in the links (thanks Brett!)</span>
+<span class="comment">1.2 - (September 13, 2004) Fixed minor issue causing invalidation (thanks Brett!)</span>
+<span class="comment">1.1 - (September 12, 2004) Will's overhaul.</span>
+<span class="comment">1.0 - Blake's original writing.</span>
+<span class="comment">"""</span>
+<span class="normal">__author__</span> <span class="symbol">=</span> <span class="string">"Blake Winton and Will Guaraldi"</span>
+<span class="normal">__version__</span> <span class="symbol">=</span> <span class="string">"1.8 (April 11, 2005)"</span>
+<span class="normal">__url__</span> <span class="symbol">=</span> <span class="string">"http://www.bluesock.org/~willg/pyblosxom/"</span>
+<span class="normal">__description__</span> <span class="symbol">=</span> <span class="string">"RSS2 renderer."</span>
+
+<span class="keyword">from</span> <span class="normal">Pyblosxom</span><span class="symbol">.</span><span class="normal">renderers</span><span class="symbol">.</span><span class="normal">base</span> <span class="keyword">import</span> <span class="normal">RendererBase</span>
+<span class="keyword">from</span> <span class="normal">Pyblosxom</span><span class="symbol">.</span><span class="normal">tools</span> <span class="keyword">import</span> <span class="normal">Stripper</span>
+<span class="keyword">from</span> <span class="normal">xml</span><span class="symbol">.</span><span class="normal">dom</span><span class="symbol">.</span><span class="normal">minidom</span> <span class="keyword">import</span> <span class="normal">Document</span>
+<span class="keyword">import</span> <span class="normal">urlparse</span>
+
+<span class="keyword">class</span> <span class="function">RSS2Renderer</span><span class="symbol">(</span><span class="normal">RendererBase</span><span class="symbol">)</span><span class="symbol">:</span>
+<span class="comment"> """</span>
+<span class="comment"> This renderer is to create valid RSS2 documents without the need for a</span>
+<span class="comment"> pyblosxom template. I mostly expect you to know what you are doing, before</span>
+<span class="comment"> attempting this</span>
+<span class="comment"> """</span>
+ <span class="comment"># How long you want the simple description to be</span>
+ <span class="normal">desc_length</span> <span class="symbol">=</span> <span class="number">20</span> <span class="comment"># 20 words, at the most for me</span>
+
+ <span class="comment"># Create the big html? &lt;content:encoded&gt;, yes, then 1, else 0</span>
+ <span class="normal">create_entry</span> <span class="symbol">=</span> <span class="number">1</span>
+ <span class="normal">entry_type</span> <span class="symbol">=</span> <span class="string">'CDATA'</span> <span class="comment"># or 'escaped' - choose your poison</span>
+
+ <span class="comment"># Namespaces for you to pick and choose</span>
+ <span class="normal">namespaces</span> <span class="symbol">=</span> <span class="symbol">{</span>
+ <span class="string">'admin'</span><span class="symbol">:</span> <span class="string">"http://webns.net/mvcb/"</span><span class="symbol">,</span>
+ <span class="string">'content'</span><span class="symbol">:</span> <span class="string">"http://purl.org/rss/1.0/modules/content/"</span><span class="symbol">,</span>
+ <span class="string">'creativeCommons'</span><span class="symbol">:</span> <span class="string">"http://backend.userland.com/creativeCommonsRssModule"</span><span class="symbol">,</span>
+ <span class="string">'dc'</span><span class="symbol">:</span> <span class="string">"http://purl.org/dc/elements/1.1/"</span><span class="symbol">,</span>
+ <span class="string">'rdf'</span><span class="symbol">:</span> <span class="string">"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</span><span class="symbol">,</span>
+ <span class="string">'html'</span><span class="symbol">:</span> <span class="string">"http://www.w3.org/1999/html"</span><span class="symbol">,</span>
+ <span class="string">'slash'</span><span class="symbol">:</span> <span class="string">"http://purl.org/rss/1.0/modules/slash/"</span><span class="symbol">,</span>
+ <span class="symbol">}</span>
+
+ <span class="keyword">def</span> <span class="function">_addText</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">,</span> <span class="normal">element</span><span class="symbol">,</span> <span class="normal">text</span><span class="symbol">,</span> <span class="normal">baseElement</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="normal">e</span> <span class="symbol">=</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_doc</span><span class="symbol">.</span><span class="function">createElement</span><span class="symbol">(</span><span class="normal">element</span><span class="symbol">)</span>
+ <span class="normal">e</span><span class="symbol">.</span><span class="function">appendChild</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">.</span><span class="normal">_doc</span><span class="symbol">.</span><span class="function">createTextNode</span><span class="symbol">(</span><span class="normal">text</span><span class="symbol">)</span><span class="symbol">)</span>
+ <span class="normal">baseElement</span><span class="symbol">.</span><span class="function">appendChild</span><span class="symbol">(</span><span class="normal">e</span><span class="symbol">)</span>
+ <span class="keyword">return</span> <span class="normal">e</span>
+
+ <span class="keyword">def</span> <span class="function">_addCDATA</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">,</span> <span class="normal">element</span><span class="symbol">,</span> <span class="normal">text</span><span class="symbol">,</span> <span class="normal">baseElement</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="normal">e</span> <span class="symbol">=</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_doc</span><span class="symbol">.</span><span class="function">createElement</span><span class="symbol">(</span><span class="normal">element</span><span class="symbol">)</span>
+ <span class="normal">e</span><span class="symbol">.</span><span class="function">appendChild</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">.</span><span class="normal">_doc</span><span class="symbol">.</span><span class="function">createCDATASection</span><span class="symbol">(</span><span class="normal">text</span><span class="symbol">)</span><span class="symbol">)</span>
+ <span class="normal">baseElement</span><span class="symbol">.</span><span class="function">appendChild</span><span class="symbol">(</span><span class="normal">e</span><span class="symbol">)</span>
+ <span class="keyword">return</span> <span class="normal">e</span>
+
+ <span class="keyword">def</span> <span class="function">_addElemAttr</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">,</span> <span class="normal">element</span><span class="symbol">,</span> <span class="normal">attr</span><span class="symbol">,</span> <span class="normal">content</span><span class="symbol">,</span> <span class="normal">baseElement</span><span class="symbol">,</span> <span class="normal">text</span> <span class="symbol">=</span> <span class="normal">None</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="normal">e</span> <span class="symbol">=</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_doc</span><span class="symbol">.</span><span class="function">createElement</span><span class="symbol">(</span><span class="normal">element</span><span class="symbol">)</span>
+ <span class="normal">e</span><span class="symbol">.</span><span class="function">setAttribute</span><span class="symbol">(</span><span class="normal">attr</span><span class="symbol">,</span> <span class="normal">content</span><span class="symbol">)</span>
+ <span class="keyword">if</span> <span class="normal">text</span><span class="symbol">:</span>
+ <span class="normal">e</span><span class="symbol">.</span><span class="function">appendChild</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">.</span><span class="normal">_doc</span><span class="symbol">.</span><span class="function">createTextNode</span><span class="symbol">(</span><span class="normal">text</span><span class="symbol">)</span><span class="symbol">)</span>
+ <span class="normal">baseElement</span><span class="symbol">.</span><span class="function">appendChild</span><span class="symbol">(</span><span class="normal">e</span><span class="symbol">)</span>
+ <span class="keyword">return</span> <span class="normal">e</span>
+
+ <span class="keyword">def</span> <span class="function">_addAttr</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">,</span> <span class="normal">element</span><span class="symbol">,</span> <span class="normal">attr</span><span class="symbol">,</span> <span class="normal">content</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="normal">element</span><span class="symbol">.</span><span class="function">setAttribute</span><span class="symbol">(</span><span class="normal">attr</span><span class="symbol">,</span> <span class="normal">content</span><span class="symbol">)</span>
+
+ <span class="keyword">def</span> <span class="function">_addNameSpaces</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">,</span> <span class="normal">element</span><span class="symbol">,</span> <span class="normal">namespace_dict</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="keyword">for</span> <span class="normal">attr</span> <span class="keyword">in</span> <span class="normal">namespace_dict</span><span class="symbol">:</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addAttr</span><span class="symbol">(</span><span class="normal">element</span><span class="symbol">,</span> <span class="string">'xmlns:'</span> <span class="symbol">+</span> <span class="normal">attr</span><span class="symbol">,</span> <span class="normal">namespace_dict</span><span class="symbol">[</span><span class="normal">attr</span><span class="symbol">]</span><span class="symbol">)</span>
+
+ <span class="keyword">def</span> <span class="function">_urlEncode</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">,</span> <span class="normal">txt</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="comment"># I'm doing it here because it's only a partial url-encoding</span>
+ <span class="normal">txt</span> <span class="symbol">=</span> <span class="normal">txt</span><span class="symbol">.</span><span class="function">replace</span><span class="symbol">(</span><span class="string">" "</span><span class="symbol">,</span> <span class="string">"%20"</span><span class="symbol">)</span>
+ <span class="keyword">return</span> <span class="normal">txt</span>
+
+ <span class="keyword">def</span> <span class="function">_createChannel</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="comment"># Start our RSS document here</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="normal">_doc</span> <span class="symbol">=</span> <span class="function">Document</span><span class="symbol">(</span><span class="symbol">)</span>
+ <span class="normal">d</span> <span class="symbol">=</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_doc</span>
+ <span class="normal">rss</span> <span class="symbol">=</span> <span class="normal">d</span><span class="symbol">.</span><span class="function">createElement</span><span class="symbol">(</span><span class="string">'rss'</span><span class="symbol">)</span>
+ <span class="normal">rss</span><span class="symbol">.</span><span class="function">setAttribute</span><span class="symbol">(</span><span class="string">'version'</span><span class="symbol">,</span> <span class="string">'2.0'</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addNameSpaces</span><span class="symbol">(</span><span class="normal">rss</span><span class="symbol">,</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">namespaces</span><span class="symbol">)</span>
+ <span class="normal">d</span><span class="symbol">.</span><span class="function">appendChild</span><span class="symbol">(</span><span class="normal">rss</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="normal">_channel</span> <span class="symbol">=</span> <span class="normal">d</span><span class="symbol">.</span><span class="function">createElement</span><span class="symbol">(</span><span class="string">'channel'</span><span class="symbol">)</span>
+ <span class="normal">channel</span> <span class="symbol">=</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_channel</span>
+ <span class="normal">rss</span><span class="symbol">.</span><span class="function">appendChild</span><span class="symbol">(</span><span class="normal">channel</span><span class="symbol">)</span>
+
+ <span class="comment"># Add details about our blog here</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addText</span><span class="symbol">(</span><span class="string">'title'</span><span class="symbol">,</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">[</span><span class="string">'blog_title'</span><span class="symbol">]</span><span class="symbol">,</span> <span class="normal">channel</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addText</span><span class="symbol">(</span><span class="string">'link'</span><span class="symbol">,</span> <span class="normal">self</span><span class="symbol">.</span><span class="function">_urlEncode</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">[</span><span class="string">'base_url'</span><span class="symbol">]</span><span class="symbol">)</span><span class="symbol">,</span> <span class="normal">channel</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addText</span><span class="symbol">(</span><span class="string">'description'</span><span class="symbol">,</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">[</span><span class="string">'blog_description'</span><span class="symbol">]</span><span class="symbol">,</span> <span class="normal">channel</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addText</span><span class="symbol">(</span><span class="string">'language'</span><span class="symbol">,</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">[</span><span class="string">'blog_language'</span><span class="symbol">]</span><span class="symbol">,</span> <span class="normal">channel</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addText</span><span class="symbol">(</span><span class="string">'ttl'</span><span class="symbol">,</span> <span class="string">'60'</span><span class="symbol">,</span> <span class="normal">channel</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addText</span><span class="symbol">(</span><span class="string">'dc:creator'</span><span class="symbol">,</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">[</span><span class="string">'blog_author'</span><span class="symbol">]</span><span class="symbol">,</span> <span class="normal">channel</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addElemAttr</span><span class="symbol">(</span><span class="string">'admin:generatorAgent'</span><span class="symbol">,</span> <span class="symbol">\</span>
+ <span class="string">'rdf:resource'</span><span class="symbol">,</span> <span class="symbol">\</span>
+ <span class="string">'http://pyblosxom.sourceforge.net/'</span><span class="symbol">,</span> <span class="symbol">\</span>
+ <span class="normal">channel</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addElemAttr</span><span class="symbol">(</span><span class="string">'admin:errorReportsTo'</span><span class="symbol">,</span> <span class="symbol">\</span>
+ <span class="string">'rdf:resource'</span><span class="symbol">,</span> <span class="symbol">\</span>
+ <span class="string">"mailto:"</span> <span class="symbol">+</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">.</span><span class="function">get</span><span class="symbol">(</span><span class="string">"blog_email"</span><span class="symbol">,</span> <span class="string">"none"</span><span class="symbol">)</span><span class="symbol">,</span> <span class="symbol">\</span>
+ <span class="normal">channel</span><span class="symbol">)</span>
+
+ <span class="keyword">def</span> <span class="function">_generateDesc</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">,</span> <span class="normal">html</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="normal">s</span> <span class="symbol">=</span> <span class="function">Stripper</span><span class="symbol">(</span><span class="symbol">)</span>
+ <span class="normal">s</span><span class="symbol">.</span><span class="function">feed</span><span class="symbol">(</span><span class="normal">html</span><span class="symbol">)</span>
+ <span class="normal">str</span> <span class="symbol">=</span> <span class="normal">s</span><span class="symbol">.</span><span class="function">gettext</span><span class="symbol">(</span><span class="symbol">)</span>
+ <span class="normal">frag</span> <span class="symbol">=</span> <span class="normal">str</span><span class="symbol">.</span><span class="function">split</span><span class="symbol">(</span><span class="symbol">)</span>
+ <span class="keyword">if</span> <span class="function">len</span><span class="symbol">(</span><span class="normal">frag</span><span class="symbol">)</span> <span class="symbol">&gt;</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">desc_length</span><span class="symbol">:</span>
+ <span class="normal">frag</span> <span class="symbol">=</span> <span class="normal">frag</span><span class="symbol">[</span><span class="symbol">:</span><span class="normal">self</span><span class="symbol">.</span><span class="normal">desc_length</span><span class="symbol">]</span>
+ <span class="normal">frag</span><span class="symbol">.</span><span class="function">append</span><span class="symbol">(</span><span class="string">'...'</span><span class="symbol">)</span>
+ <span class="keyword">return</span> <span class="string">' '</span><span class="symbol">.</span><span class="function">join</span><span class="symbol">(</span><span class="normal">frag</span><span class="symbol">)</span>
+
+ <span class="keyword">def</span> <span class="function">_createItem</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">,</span> <span class="normal">entry</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="normal">burl</span> <span class="symbol">=</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">[</span><span class="string">'base_url'</span><span class="symbol">]</span>
+
+ <span class="normal">d</span> <span class="symbol">=</span> <span class="normal">urlparse</span><span class="symbol">.</span><span class="function">urlsplit</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">[</span><span class="string">'base_url'</span><span class="symbol">]</span><span class="symbol">)</span>
+ <span class="normal">domain</span> <span class="symbol">=</span> <span class="string">'%s://%s'</span> <span class="symbol">%</span> <span class="symbol">(</span><span class="normal">d</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">]</span><span class="symbol">,</span> <span class="normal">d</span><span class="symbol">[</span><span class="number">1</span><span class="symbol">]</span><span class="symbol">)</span>
+ <span class="normal">item</span> <span class="symbol">=</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_doc</span><span class="symbol">.</span><span class="function">createElement</span><span class="symbol">(</span><span class="string">'item'</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="normal">_channel</span><span class="symbol">.</span><span class="function">appendChild</span><span class="symbol">(</span><span class="normal">item</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addText</span><span class="symbol">(</span><span class="string">'title'</span><span class="symbol">,</span> <span class="normal">entry</span><span class="symbol">[</span><span class="string">'title'</span><span class="symbol">]</span><span class="symbol">,</span> <span class="normal">item</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addElemAttr</span><span class="symbol">(</span><span class="string">'guid'</span><span class="symbol">,</span> <span class="string">'isPermaLink'</span><span class="symbol">,</span> <span class="string">'false'</span><span class="symbol">,</span> <span class="normal">item</span><span class="symbol">,</span> <span class="normal">entry</span><span class="symbol">[</span><span class="string">'file_path'</span><span class="symbol">]</span><span class="symbol">)</span>
+ <span class="normal">url</span> <span class="symbol">=</span> <span class="normal">urlparse</span><span class="symbol">.</span><span class="function">urljoin</span><span class="symbol">(</span><span class="normal">burl</span> <span class="symbol">+</span> <span class="string">"/"</span><span class="symbol">,</span> <span class="normal">entry</span><span class="symbol">[</span><span class="string">"file_path"</span><span class="symbol">]</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addText</span><span class="symbol">(</span><span class="string">'link'</span><span class="symbol">,</span> <span class="normal">self</span><span class="symbol">.</span><span class="function">_urlEncode</span><span class="symbol">(</span><span class="normal">url</span><span class="symbol">)</span><span class="symbol">,</span> <span class="normal">item</span><span class="symbol">)</span>
+
+ <span class="comment"># Text entry</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addText</span><span class="symbol">(</span><span class="string">'description'</span><span class="symbol">,</span> <span class="normal">self</span><span class="symbol">.</span><span class="function">_generateDesc</span><span class="symbol">(</span><span class="normal">entry</span><span class="symbol">[</span><span class="string">'body'</span><span class="symbol">]</span><span class="symbol">)</span><span class="symbol">,</span> <span class="normal">item</span><span class="symbol">)</span>
+ <span class="keyword">if</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">create_entry</span><span class="symbol">:</span>
+ <span class="keyword">if</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">entry_type</span> <span class="symbol">=</span><span class="symbol">=</span> <span class="string">'CDATA'</span><span class="symbol">:</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addCDATA</span><span class="symbol">(</span><span class="string">'content:encoded'</span><span class="symbol">,</span> <span class="normal">entry</span><span class="symbol">[</span><span class="string">'body'</span><span class="symbol">]</span><span class="symbol">,</span> <span class="normal">item</span><span class="symbol">)</span>
+ <span class="keyword">else</span><span class="symbol">:</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addText</span><span class="symbol">(</span><span class="string">'content:encoded'</span><span class="symbol">,</span> <span class="normal">entry</span><span class="symbol">[</span><span class="string">'body'</span><span class="symbol">]</span><span class="symbol">,</span> <span class="normal">item</span><span class="symbol">)</span>
+ <span class="comment"># Metadata stuff</span>
+ <span class="comment"># Category</span>
+ <span class="keyword">if</span> <span class="normal">entry</span><span class="symbol">[</span><span class="string">'path'</span><span class="symbol">]</span><span class="symbol">.</span><span class="function">strip</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="comment"># category or dc:subject, but NOT both</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addElemAttr</span><span class="symbol">(</span><span class="string">'category'</span><span class="symbol">,</span> <span class="string">'domain'</span><span class="symbol">,</span> <span class="normal">domain</span><span class="symbol">,</span> <span class="normal">item</span><span class="symbol">,</span> <span class="normal">entry</span><span class="symbol">[</span><span class="string">'path'</span><span class="symbol">]</span><span class="symbol">)</span>
+ <span class="comment">#self._addText('dc:subject', entry['path'], item)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_addText</span><span class="symbol">(</span><span class="string">'dc:date'</span><span class="symbol">,</span> <span class="normal">entry</span><span class="symbol">[</span><span class="string">'w3cdate'</span><span class="symbol">]</span><span class="symbol">,</span> <span class="normal">item</span><span class="symbol">)</span>
+
+ <span class="keyword">def</span> <span class="function">render</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">,</span> <span class="normal">header</span> <span class="symbol">=</span> <span class="number">1</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="keyword">if</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">rendered</span> <span class="symbol">=</span><span class="symbol">=</span> <span class="number">1</span><span class="symbol">:</span>
+ <span class="keyword">return</span>
+
+ <span class="normal">self</span><span class="symbol">.</span><span class="normal">_data</span> <span class="symbol">=</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_request</span><span class="symbol">.</span><span class="function">getData</span><span class="symbol">(</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span> <span class="symbol">=</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_request</span><span class="symbol">.</span><span class="function">getConfiguration</span><span class="symbol">(</span><span class="symbol">)</span>
+
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">addHeader</span><span class="symbol">(</span><span class="string">'Content-Type'</span><span class="symbol">,</span> <span class="string">'application/xml'</span><span class="symbol">)</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">showHeaders</span><span class="symbol">(</span><span class="symbol">)</span>
+
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_createChannel</span><span class="symbol">(</span><span class="symbol">)</span>
+
+ <span class="keyword">if</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">.</span><span class="function">get</span><span class="symbol">(</span><span class="string">"num_entries"</span><span class="symbol">,</span> <span class="number">0</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="normal">max_entries</span> <span class="symbol">=</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">[</span><span class="string">"num_entries"</span><span class="symbol">]</span>
+ <span class="keyword">else</span><span class="symbol">:</span>
+ <span class="normal">max_entries</span> <span class="symbol">=</span> <span class="number">20</span>
+
+ <span class="keyword">if</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_content</span><span class="symbol">:</span>
+ <span class="keyword">if</span> <span class="normal">max_entries</span> <span class="symbol">&gt;</span> <span class="function">len</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">.</span><span class="normal">_content</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="normal">num_entries</span> <span class="symbol">=</span> <span class="function">len</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">.</span><span class="normal">_content</span><span class="symbol">)</span>
+ <span class="keyword">else</span><span class="symbol">:</span>
+ <span class="normal">num_entries</span> <span class="symbol">=</span> <span class="normal">max_entries</span>
+
+ <span class="keyword">for</span> <span class="normal">count</span> <span class="keyword">in</span> <span class="function">xrange</span><span class="symbol">(</span><span class="normal">num_entries</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">_createItem</span><span class="symbol">(</span><span class="normal">self</span><span class="symbol">.</span><span class="normal">_content</span><span class="symbol">[</span><span class="normal">count</span><span class="symbol">]</span><span class="symbol">)</span>
+
+ <span class="comment"># We are now ready to present the xml</span>
+
+ <span class="comment"># FIXME this is totally hokey, but if I pass the encoding into</span>
+ <span class="comment"># toxml, then it tries to convert the data to the new encoding</span>
+ <span class="comment"># and assumes the data is ascii (which is wrong).</span>
+ <span class="normal">text</span> <span class="symbol">=</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_doc</span><span class="symbol">.</span><span class="function">toxml</span><span class="symbol">(</span><span class="symbol">)</span>
+ <span class="keyword">if</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">.</span><span class="function">has_key</span><span class="symbol">(</span><span class="string">"blog_encoding"</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="normal">text</span> <span class="symbol">=</span> <span class="string">"&lt;?xml version=\"1.0\" encoding=\"%s\" ?&gt;"</span> <span class="symbol">%</span> <span class="normal">self</span><span class="symbol">.</span><span class="normal">_config</span><span class="symbol">[</span><span class="string">"blog_encoding"</span><span class="symbol">]</span> <span class="symbol">+</span> <span class="normal">text</span><span class="symbol">[</span><span class="normal">text</span><span class="symbol">.</span><span class="function">find</span><span class="symbol">(</span><span class="string">"\n"</span><span class="symbol">)</span><span class="symbol">:</span><span class="symbol">]</span>
+
+ <span class="normal">self</span><span class="symbol">.</span><span class="function">write</span><span class="symbol">(</span><span class="normal">text</span><span class="symbol">)</span>
+
+ <span class="normal">self</span><span class="symbol">.</span><span class="normal">rendered</span> <span class="symbol">=</span> <span class="number">1</span>
+
+<span class="keyword">def</span> <span class="function">cb_renderer</span><span class="symbol">(</span><span class="normal">args</span><span class="symbol">)</span><span class="symbol">:</span>
+ <span class="keyword">import</span> <span class="normal">sys</span>
+ <span class="normal">req</span> <span class="symbol">=</span> <span class="normal">args</span><span class="symbol">[</span><span class="string">'request'</span><span class="symbol">]</span>
+ <span class="normal">http</span> <span class="symbol">=</span> <span class="normal">req</span><span class="symbol">.</span><span class="function">getHttp</span><span class="symbol">(</span><span class="symbol">)</span>
+ <span class="normal">conf</span> <span class="symbol">=</span> <span class="normal">req</span><span class="symbol">.</span><span class="function">getConfiguration</span><span class="symbol">(</span><span class="symbol">)</span>
+
+ <span class="normal">ext</span> <span class="symbol">=</span> <span class="normal">conf</span><span class="symbol">.</span><span class="function">get</span><span class="symbol">(</span><span class="string">"rss2_extension"</span><span class="symbol">,</span> <span class="string">"/index.rss2"</span><span class="symbol">)</span>
+ <span class="keyword">if</span> <span class="normal">http</span><span class="symbol">[</span><span class="string">'PATH_INFO'</span><span class="symbol">]</span><span class="symbol">.</span><span class="function">endswith</span><span class="symbol">(</span> <span class="normal">ext</span> <span class="symbol">)</span><span class="symbol">:</span>
+ <span class="normal">http</span><span class="symbol">[</span><span class="string">'PATH_INFO'</span><span class="symbol">]</span> <span class="symbol">=</span> <span class="normal">http</span><span class="symbol">[</span><span class="string">'PATH_INFO'</span><span class="symbol">]</span><span class="symbol">[</span><span class="symbol">:</span><span class="symbol">-</span><span class="function">len</span><span class="symbol">(</span><span class="normal">ext</span><span class="symbol">)</span><span class="symbol">]</span>
+ <span class="keyword">return</span> <span class="function">RSS2Renderer</span><span class="symbol">(</span><span class="normal">req</span><span class="symbol">,</span> <span class="normal">conf</span><span class="symbol">.</span><span class="function">get</span><span class="symbol">(</span><span class="string">'stdoutput'</span><span class="symbol">,</span> <span class="normal">sys</span><span class="symbol">.</span><span class="normal">stdout</span><span class="symbol">)</span><span class="symbol">)</span>
+
+<span class="comment"># vim: tabstop=4 shiftwidth=4 expandtab</span>
+</tt></pre>
+</body>
+<script>function PrivoxyWindowOpen(a, b, c){return(window.open(a, b, c));}</script></html>