diff options
author | 2005-07-24 14:51:50 +0000 | |
---|---|---|
committer | 2005-07-24 14:51:50 +0000 | |
commit | ab519ec8dd7f33784bdae57ccd5cbf01d0c2dc2a (patch) | |
tree | fa1858acb4c2c4e399719026a23ac4060700e935 /www-apps/pyblosxom-plugins/files | |
parent | Fixed digests (diff) | |
download | overlay-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.py | 234 | ||||
-rw-r--r-- | www-apps/pyblosxom-plugins/files/rss2renderer.py.html | 251 |
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? <content:encoded>, 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">></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">></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">"<?xml version=\"1.0\" encoding=\"%s\" ?>"</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> |