You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bloodhound.apache.org by gj...@apache.org on 2012/06/18 14:06:18 UTC

svn commit: r1351312 - in /incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard: layouts/templates/widget_macros.html web_ui.py

Author: gjm
Date: Mon Jun 18 12:06:17 2012
New Revision: 1351312

URL: http://svn.apache.org/viewvc?rev=1351312&view=rev
Log:
dashboard: changes to bh:args tag partising in widget XML markup - towards #45 (from olemis)

Modified:
    incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/layouts/templates/widget_macros.html
    incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/web_ui.py

Modified: incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/layouts/templates/widget_macros.html
URL: http://svn.apache.org/viewvc/incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/layouts/templates/widget_macros.html?rev=1351312&r1=1351311&r2=1351312&view=diff
==============================================================================
--- incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/layouts/templates/widget_macros.html (original)
+++ incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/layouts/templates/widget_macros.html Mon Jun 18 12:06:17 2012
@@ -89,7 +89,7 @@
   <py:match path="bh:widget">
     <py:choose test="">
       <py:when test="bhdb"
-          py:with="wnm = unicode(select('@urn')); args = unicode(select('bh:args/text()')) or {}; altlinks = unicode(select('@altlinks')) != 'false'; ctxtnav = unicode(select('@ctxtnav')) != 'false';">
+          py:with="wnm = unicode(select('@urn')); args = select('bh:args/bh:arg') or {}; altlinks = unicode(select('@altlinks')) != 'false'; ctxtnav = unicode(select('@ctxtnav')) != 'false';">
         ${widget_container(bhdb.expand_widget(context, dict(args=[wnm, None, {'args': args}], altlinks=altlinks, ctxtnav=ctxtnav)))}
       </py:when>
       <py:otherwise>

Modified: incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/web_ui.py
URL: http://svn.apache.org/viewvc/incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/web_ui.py?rev=1351312&r1=1351311&r2=1351312&view=diff
==============================================================================
--- incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/web_ui.py (original)
+++ incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/web_ui.py Mon Jun 18 12:06:17 2012
@@ -32,6 +32,7 @@ import re
 from uuid import uuid4
 
 from genshi.builder import tag
+from genshi.core import Stream
 from trac.core import Component, implements
 from trac.config import Option, IntOption
 from trac.mimeview.api import Context
@@ -329,8 +330,12 @@ class DashboardChrome:
         :param widget: Widget definition
         """
         dbmod = DashboardModule(self.env)
-        if isinstance(widget['args'], basestring):
-            widget['args'] = _json.loads(widget['args'])
+        options = widget['args'][2]
+        argsdef = options.get('args')
+        if isinstance(argsdef, basestring):
+            options['args'] = _json.loads(argsdef)
+        elif isinstance(argsdef, Stream):
+            options['args'] = parse_args_tag(argsdef)
         return dbmod.expand_widget_data(
                     context.req,
                     {'widgets' : { 0 : widget }}
@@ -340,34 +345,30 @@ class DashboardChrome:
 #    Stream processors
 #------------------------------------------------------
 
-def parse_widgets_markup(stream):
-    """Parse Genshi Markup for a set of widgets
-    """
-    s = iter(stream)
-
-    # Check that stream starts by opening bh:widgets tag
-    token, data, pos = s.next()
-    assert token == 'START'
-    assert data[0].namespace == XMLNS_DASHBOARD_UI
-    assert data[1].localname == 'widgets'
-
-    # Continue parsing bh:w tag
-    def find(_s, tkn, ns, localname):
-        for token, data, pos in _s:
-            if token == tkn and data[0].namespace != ns \
-                    and data[1].localname != localname:
-                return token, data, pos
-        else:
-            return None
-
-    i = find(s, 'START', XMLNS_DASHBOARD_UI, 'widget')
-
-    # TODO: Finish parsing widgets markup
-
-    #if i is not None:
-    #    i = find()
-
-def parse_widget_markup(stream):
-    """Parse Genshi Markup for a single widget
+def parse_args_tag(stream):
+    """Parse Genshi Markup for widget arguments
     """
+    args = {}
+    inside = False
+    argnm = ''
+    argvalue = ''
+    for kind, data, _ in stream:
+        if kind == Stream.START:
+            qname, attrs = data
+            if qname.namespace == XMLNS_DASHBOARD_UI \
+                    and qname.localname == 'arg':
+                if inside :
+                    raise RuntimeError('Nested bh:arg tag')
+                else:
+                    argnm = attrs.get('name')
+                    argvalue  = ''
+                    inside = True
+        elif kind == Stream.TEXT:
+            argvalue += data
+        elif kind == Stream.END:
+            if qname.namespace == XMLNS_DASHBOARD_UI \
+                    and qname.localname == 'arg':
+                args[argnm] = argvalue
+                inside = False
+    return args