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.
------------------------------------------------------------------------
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)
------------------------------------------------------------------------
_______________________________________________
Twisted-web mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web