summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'www-apps/pyblosxom-plugins/files/rss2renderer.py')
-rw-r--r--www-apps/pyblosxom-plugins/files/rss2renderer.py234
1 files changed, 0 insertions, 234 deletions
diff --git a/www-apps/pyblosxom-plugins/files/rss2renderer.py b/www-apps/pyblosxom-plugins/files/rss2renderer.py
deleted file mode 100644
index ff73c64..0000000
--- a/www-apps/pyblosxom-plugins/files/rss2renderer.py
+++ /dev/null
@@ -1,234 +0,0 @@
-"""
-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