from interfaces import * |
from interfaces import * |
from xml.sax.saxutils import quoteattr, escape |
from xml.sax.saxutils import quoteattr, escape |
from publish import TraversalPath |
from publish import TraversalPath |
|
from environ import getAbsoluteURL, getInteraction, getCurrent |
|
from environ import childContext, parentContext |
|
|
__all__ = [ |
__all__ = [ |
'TEMPLATE_NS', 'DOMLETS_PROPERTY', 'DOMletParser', 'TemplateDocument' |
'TEMPLATE_NS', 'DOMLETS_PROPERTY', 'DOMletParser', 'TemplateDocument' |
|
|
|
|
|
|
|
|
|
|
class DOMletState(binding.Component): |
class DOMletState(binding.Component): |
|
|
"""Execution state for a DOMlet""" |
"""Execution state for a DOMlet""" |
|
|
|
|
|
|
class DOMletAsWebPage(binding.Component): |
class DOMletAsHTTP(binding.Component): |
|
|
"""Render a template component""" |
"""Render a template component""" |
|
|
protocols.advise( |
protocols.advise( |
instancesProvide = [IWebPage], |
instancesProvide = [IHTTPHandler], |
asAdapterForProtocols = [IDOMletNode], |
asAdapterForProtocols = [IDOMletNode], |
factoryMethod = 'fromNode' |
factoryMethod = 'fromNode' |
) |
) |
|
|
fromNode = classmethod(fromNode) |
fromNode = classmethod(fromNode) |
|
|
def render(self, context): |
def handle_http(self, environ, input, errors): |
myOwner = context.getParentComponent() |
myOwner = parentContext(environ) |
|
|
data = [] |
data = [] |
|
|
self.templateNode.renderFor( |
self.templateNode.renderFor( |
myOwner, |
myOwner, |
DOMletState( |
DOMletState(myOwner, write=data.append) |
myOwner, write=data.append |
|
) |
|
) |
) |
return unicodeJoin(data) |
|
|
|
|
return '200 OK', [], [unicodeJoin(data)] # XXX content-type |
|
|
|
|
|
|
|
|
write = state.write |
write = state.write |
write(self._openTag) |
write(self._openTag) |
write(escape(unicode(data.subject))) |
write(escape(unicode(getCurrent(data)))) |
write(self._closeTag) |
write(self._closeTag) |
|
|
|
|
|
|
write = state.write |
write = state.write |
write(self._openTag) |
write(self._openTag) |
write(unicode(data.subject)) |
write(unicode(getCurrent(data))) |
write(self._closeTag) |
write(self._closeTag) |
|
|
|
|
if self.dataSpec: |
if self.dataSpec: |
data, state = self._traverse(data, state) |
data, state = self._traverse(data, state) |
|
|
url = unicode(data.absoluteURL) |
url = unicode(getAbsoluteURL(data)) |
|
|
if not self.optimizedChildren and not self.nonEmpty: |
if not self.optimizedChildren and not self.nonEmpty: |
state.write(self._emptyTag % locals()) |
state.write(self._emptyTag % locals()) |
write = state.write |
write = state.write |
|
|
write(self._openTag) |
write(self._openTag) |
write(unicode(data.absoluteURL)) |
write(unicode(getAbsoluteURL(data))) |
write(self._closeTag) |
write(self._closeTag) |
|
|
|
|
state.write(self._openTag) |
state.write(self._openTag) |
|
|
nextPattern = infiniter(self.params['listItem']).next |
nextPattern = infiniter(self.params['listItem']).next |
allowed = data.interaction.allows |
allowed = getInteraction(data).allows |
subcontext = data.subcontext |
|
ct = 0 |
ct = 0 |
|
|
# XXX this should probably use an iteration location, or maybe |
# XXX this should probably use an iteration location, or maybe |
# XXX put some properties in execution context for loop vars? |
# XXX put some properties in execution context for loop vars? |
|
|
for item in data.subject: |
for item in getCurrent(data): |
|
|
if not allowed(item): |
if not allowed(item): |
continue |
continue |
for child in self.params.get('header',()): |
for child in self.params.get('header',()): |
child.renderFor(data,state) |
child.renderFor(data,state) |
|
|
loc = subcontext(str(ct), item) |
loc = childContext(data, str(ct), item) |
nextPattern().renderFor(loc, state) |
nextPattern().renderFor(loc, state) |
ct += 1 |
ct += 1 |
|
|
state.write(self._closeTag) |
state.write(self._closeTag) |
|
|
|
|
|
|