[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