diff roundup/cgi/templating.py @ 3862:b052820e86bf

Add a rst method to StringHTMLProperty... ...similar to stext (which is for StructuredText) rst is for ReStructuredText. The new method supports hyperlinking which is on by default.
author Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
date Wed, 01 Aug 2007 12:42:31 +0000
parents d4ac8954ce5c
children 1bf9a4b4de33
line wrap: on
line diff
--- a/roundup/cgi/templating.py	Mon Jul 09 17:27:04 2007 +0000
+++ b/roundup/cgi/templating.py	Wed Aug 01 12:42:31 2007 +0000
@@ -42,6 +42,10 @@
         import StructuredText
     except ImportError:
         StructuredText = None
+try:
+    from docutils.core import publish_parts as ReStructuredText
+except ImportError:
+    ReStructuredText = None
 
 # bring in the templating support
 from roundup.cgi.PageTemplates import PageTemplate, GlobalTranslationService
@@ -1241,6 +1245,19 @@
     hyper_re = re.compile(r'((?P<url>\w{3,6}://\S+)|'
                           r'(?P<email>[-+=%/\w\.]+@[\w\.\-]+)|'
                           r'(?P<item>(?P<class>[A-Za-z_]+)(\s*)(?P<id>\d+)))')
+    def _hyper_repl_item(self,match,replacement):
+        item = match.group('item')
+        cls = match.group('class').lower()
+        id = match.group('id')
+        try:
+            # make sure cls is a valid tracker classname
+            cl = self._db.getclass(cls)
+            if not cl.hasnode(id):
+                return item
+            return replacement % locals()
+        except KeyError:
+            return item
+
     def _hyper_repl(self, match):
         if match.group('url'):
             s = match.group('url')
@@ -1249,17 +1266,18 @@
             s = match.group('email')
             return '<a href="mailto:%s">%s</a>'%(s, s)
         else:
-            s = match.group('item')
-            s1 = match.group('class').lower()
-            s2 = match.group('id')
-            try:
-                # make sure s1 is a valid tracker classname
-                cl = self._db.getclass(s1)
-                if not cl.hasnode(s2):
-                    return s
-                return '<a href="%s%s">%s</a>'%(s1, s2, s)
-            except KeyError:
-                return s
+            return self._hyper_repl_item(match,
+                '<a href="%(cls)s%(id)s">%(item)s</a>')
+
+    def _hyper_repl_rst(self, match):
+        if match.group('url'):
+            s = match.group('url')
+            return '`%s <%s>`_'%(s, s)
+        elif match.group('email'):
+            s = match.group('email')
+            return '`%s <mailto:%s>`_'%(s, s)
+        else:
+            return self._hyper_repl_item(match,'`%(item)s <%(cls)s%(id)s>`_')
 
     def hyperlinked(self):
         """ Render a "hyperlinked" version of the text """
@@ -1329,6 +1347,22 @@
             return s
         return StructuredText(s,level=1,header=0)
 
+    def rst(self, hyperlink=1):
+        """ Render the value of the property as ReStructuredText.
+
+            This requires docutils to be installed separately.
+        """
+        if not self.is_view_ok():
+            return self._('[hidden]')
+
+        if not ReStructuredText:
+            return self.plain(escape=0, hyperlink=hyperlink)
+        s = self.plain(escape=0, hyperlink=0)
+        if hyperlink:
+            s = self.hyper_re.sub(self._hyper_repl_rst, s)
+        return ReStructuredText(s, writer_name="html")["body"].encode("utf-8",
+            "replace")
+
     def field(self, **kwargs):
         """ Render the property as a field in HTML.
 

Roundup Issue Tracker: http://roundup-tracker.org/