[Twisted-web] Standard sequence renderer "loosing" tags?

A. Goryunov agoryunov at list.ru
Sat Dec 17 14:22:50 MST 2005


I've noticed that Page.renderString() "swallows" some of the stan nodes. 
I've also tried the example below in an actual Twisted service and got 
the same result. Doing it with an XML template also yields erroneous 
output. Namely, it looses "table", "tr", a couple of "td" tags were MIA 
too I believe, as well as two "input"s.

The code I was using for testing is attached. It's supposed to be a 
library of widgets that are constructed using Fragments and render_sequence.

-------------- next part --------------
from nevow import tags as T
from nevow import flat, rend, loaders




class TestPage(rend.Page):
    docFactory = loaders.stan(
        T.html[
            T.body[
                T.invisible(render=T.directive("widget"))[
                    T.invisible(pattern="widget_name")['PortalContent'],
                    T.invisible(pattern="widget_slot")['main_content'],
                    T.invisible(pattern="widget_slot")[
                        T.invisible(render=T.directive("widget"))[
                            T.invisible(pattern="widget_name")['PortalBarVert'],
                            T.invisible(pattern="widget_slot")[
                                T.invisible(render=T.directive("widget"))[
                                    T.invisible(pattern="widget_name")['LoginForm'],
                                    T.invisible(pattern="widget_slot")['Sign in'],
                                    T.invisible(pattern="widget_slot")['User: '],
                                    T.invisible(pattern="widget_slot")['Password: '],
                                    T.invisible(pattern="widget_slot")[T.input(type="submit", name="null", value="Submit")]
                                ]
                            ]
                        ]
                    ]
                ]
            ]])

    def render_widget(self,ctx,data):
        wName = ctx.tag.onePattern("widget_name").children[0].strip('\n\t ')
        attrs = ctx.tag.allPatterns("widget_slot")
        args = []
        for attr in attrs:
            args.append(T.xml(attr.children))
        try:
            wdgt = globals()[wName](args)
            return ctx.tag[wdgt]
        except IndexError:
            return ctx.tag[T.p(style="font-color : red")["Unknown widget name: %s" % wName]]
        
        
class LoginForm(rend.Fragment):
    docFactory = loaders.stan(
        T.div(class_="login-form", render=T.directive("sequence"))[
            T.p(class_="small-form-title", pattern="item", render=T.directive('arg')),
            T.form(action="_submit", method="post")[
                T.table(id="login-form-table")[
                    T.tr[
                        T.td(align="right")[
                            T.label(for_="user", pattern="item", render=T.directive('arg'))
                            ],
                        T.td(align="left")[
                            T.input(type="text", name="user",
                                    class_="login-input")
                            ]
                        ],
                    T.tr[
                        T.td(align="right")[
                            T.label(for_="pass", pattern="item", render=T.directive('arg'))
                            ],
                        T.td(align="left")[
                            T.input(type="password", name="pass",
                                    class_="login-input")
                            ]
                        ],
                    T.tr[T.td(colspan="2")],
                    T.tr[
                        T.td(colspan="2", align="center", pattern="item", render=T.directive('arg'))
                        ]
                    ]
                ]
            ])

    def render_arg(self,ctx,data):
        return ctx.tag[data]

class PortalContent(rend.Fragment):
    docFactory = loaders.stan(
        T.table(id="portal-content", render=T.directive("sequence"))[
            T.tr[
                T.td(class_="portal-content-main", pattern='item', render=T.directive('arg')),
                T.td(class_="portal-content-sidebar", id="portal-sidebar-right",
                     pattern="item", render=T.directive("arg"))
                ]
            ])

    def render_arg(self,ctx,data):
        return ctx.tag[data]
    
class PortalBarVert(rend.Fragment):
    docFactory = loaders.stan(
        T.table(class_="portal-bar-vertical", render=T.directive('sequence'))[
            T.tr(pattern='item', render=T.directive('arg'))
            ])

    def render_arg(self,ctx,data):
        return ctx.tag[T.td(class_='vert-sidebar-slot')[data]]



page = TestPage()
df = page.renderString()
def printPage(result):
    print result

def printErr(err):
    print err
df.addCallback(printPage)
df.addErrback(printErr)


More information about the Twisted-web mailing list