add software page handling
M muyhomepage2/app/configuration.py +2 -1
@@ 2,6 2,7 @@ 
 from muyhomepage2.pagehandlers.standard import StandardHandler
 from muyhomepage2.pagehandlers.tagsummary import TagSummaryHandler
 from muyhomepage2.pagehandlers.tagglobal import TagGlobalHandler
+from muyhomepage2.pagehandlers.software import SoftwareHandler
 
 
 DEFAULT_HANDLERS = {

          
@@ 9,7 10,7 @@ DEFAULT_HANDLERS = {
     'blog': StandardHandler,
     'tagsummary': TagSummaryHandler,
     'tagglobal': TagGlobalHandler,
-    'software': StandardHandler,
+    'software': SoftwareHandler,
     'atom': StandardHandler,
     'rss2': StandardHandler,
     }

          
A => muyhomepage2/pagehandlers/software.py +88 -0
@@ 0,0 1,88 @@ 
+
+import re
+from muyhomepage2.pagehandlers import handler
+from muyhomepage2.text import wikirst
+
+class SoftwareHandler(handler.PageHandler):
+    def content(self):
+        return wikirst.format(self.page.body)
+
+    @property
+    def software(self):
+        return SoftwareInfo(self.page)
+
+    def template(self):
+        return 'softwarepage.html'
+
+    def extension(self, website, config):
+        return None
+
+
+class SoftwareInfo(object):
+    def __init__(self, page):
+        self.page = page
+
+    @property
+    def version(self):
+        ver = self.page.headers.get('software-version')
+        if not ver:
+            ver = self.page.headers.get('x-software-version')
+        if not ver:
+            ver = ''
+        return ver
+
+    @property
+    def language(self):
+        lang = self.page.headers.get('software-lang')
+        if not lang:
+            lang = self.page.headers.get('x-software-lang')
+        if not lang:
+            lang = ''
+        return lang
+
+    @property
+    def downloads(self):
+        dl = (self.page.headers.get('downloads') or '').strip()
+        if not dl:
+            return []
+        return list(parse_reflist(dl))
+
+    @property
+    def dependencies(self):
+        dp = (self.page.headers.get('dependencies') or '').strip()
+        if not dp:
+            return []
+        return list(parse_reflist(dp))
+
+    @property
+    def sources(self):
+    # Software-RCS: Hg
+    # Software-RCS-Url: http://hg.asynchrono.us/scrob-ws
+        rcs = self.page.headers.get('software-rcs')
+        if not rcs:
+            return []
+        if rcs in ('Hg', 'Mercurial'):
+            return self._hgsources()
+        raise ValueError('unexpected rcs name: %r' % rcs)
+
+    def _hgsources(self):
+        url = self.page.headers.get('software-rcs-url')
+        if not url:
+            return []
+        return [
+            ('Type <tt class="literal">hg clone %s</tt> at the command'
+             ' prompt to get a copy of the development source code.') % url,
+            '<a href="%s">Source Code Web View</a>' % url,
+            ]
+
+
+def parse_reflist(txt):
+    for part in (d.strip() for d in txt.split(';')):
+        if not part:
+            continue
+        tmatch = re.search(r'(.+) <(.+)>', part.replace('\n', ' '))
+        if not tmatch:
+            raise ValueError('invalid section: %r' % part)
+        label = tmatch.group(1).strip()
+        url = tmatch.group(2).strip()
+        yield (url, label)

          
A => skins/default/softwarepage.html +59 -0
@@ 0,0 1,59 @@ 
+{% extends "base.html" %}
+
+{% block main %}
+<div id="page-content">
+  <h2>{{current.page.title}}</h2>
+  <div></div>
+  <div class="written-text">
+    {{current.content()}}
+  </div>
+  <div></div>
+
+  <div class="post-text">
+    <h3>Details</h3>
+    <a name="software-details"></a>
+    <dl>
+        {% if current.software.version %}
+        <dt>Current Version</dt>
+        <dd>{{current.software.version}}</dd>
+        {% endif %}
+
+        {% if current.software.language %}
+        <dt>Language</dt>
+        <dd>{{current.software.language}}</dd>
+        {% endif %}
+
+        {% if current.software.dependencies %}
+        <dt>Dependencies</dt>
+        {% for link, text in current.software.dependencies %}
+          <dd><a href="{{link}}">{{text}}</a></dd>
+        {% endfor %}
+        {% endif %}
+
+        {% if current.software.downloads %}
+        <dt>Downloads</dt>
+        {% for link, text in current.software.downloads %}
+          <dd><a href="{{link}}">{{text}}</a></dd>
+        {% endfor %}
+        {% endif %}
+
+        {% if current.software.sources %}
+        <dt>Downloads</dt>
+        {% for html in current.software.sources %}
+          <dd>{{html}}</dd>
+        {% endfor %}
+        {% endif %}
+    </dl>
+
+  <ul class="tidbits">
+    <li>
+        <a href="mailto:phglogistonjohn+web@gmail.com?={{current.page.title}}">
+            Comment on {{current.page.title}}
+        </a>
+    </li>
+    <li>
+        <!-- repeat tidbits -->
+    </li>
+  </ul>
+</div>
+{% endblock %}