[Checkins] SVN: Sandbox/malthe/chameleon.zpt/ Genshi interpolation expressions are now supported outside tags.
Malthe Borch
mborch at gmail.com
Mon Sep 22 12:12:44 EDT 2008
Log message for revision 91356:
Genshi interpolation expressions are now supported outside tags.
Changed:
U Sandbox/malthe/chameleon.zpt/README.txt
U Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py
U Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.py
U Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.txt
U Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/template.txt
-=-
Modified: Sandbox/malthe/chameleon.zpt/README.txt
===================================================================
--- Sandbox/malthe/chameleon.zpt/README.txt 2008-09-22 16:09:24 UTC (rev 91355)
+++ Sandbox/malthe/chameleon.zpt/README.txt 2008-09-22 16:12:44 UTC (rev 91356)
@@ -43,6 +43,13 @@
4. The default expression type is Python.
+5. Genshi expression interpolation syntax is supported outside tags, e.g.
+
+ <span>
+ Hello, ${'world'}!
+ </span>
+
+
.. _TAL: http://wiki.zope.org/ZPT/TALSpecification14
Modified: Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py
===================================================================
--- Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py 2008-09-22 16:09:24 UTC (rev 91355)
+++ Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py 2008-09-22 16:12:44 UTC (rev 91356)
@@ -18,7 +18,10 @@
re_method = re.compile(r'^(?P<name>[A-Za-z0-9_]+)'
'(\((?P<args>[A-Za-z0-9_]+\s*(,\s*[A-Za-z0-9_]+)*)\))?')
- def translator(self, name):
+ def __init__(self):
+ self.translator = self
+
+ def pragma(self, name):
return component.queryUtility(
interfaces.IExpressionTranslator, name=name) or \
component.queryAdapter(
@@ -327,7 +330,7 @@
match = self.re_pragma.match(string[i:])
if match is not None:
pragma = match.group('pragma')
- translator = self.translator(pragma)
+ translator = self.pragma(pragma)
if translator is not None:
i += match.end()
continue
@@ -360,45 +363,8 @@
return types.parts(parts)
-class PythonTranslator(ExpressionTranslator):
- """Implements Python expression translation."""
-
- def validate(self, string):
- """We use the ``parser`` module to determine if
- an expression is a valid python expression."""
-
- if isinstance(string, unicode):
- string = string.encode('utf-8')
-
- parser.expr(string.strip())
-
- def translate(self, string):
- if isinstance(string, str):
- string = string.decode('utf-8')
-
- return types.value(string.strip())
-
-python_translator = PythonTranslator()
-
-class StringTranslator(ExpressionTranslator):
- """Implements string translation expression."""
-
- component.adapts(interfaces.IExpressionTranslator)
-
- re_interpolation = re.compile(r'(?P<prefix>[^\\]\$|^\$)({((?P<expression>.*)})?|'
- '(?P<variable>[A-Za-z][A-Za-z0-9_]*))')
-
- def __init__(self, translator):
- self._translator = translator
-
- def validate(self, string):
- self.split(string)
-
- def translate(self, string):
- return types.join(self.split(string))
-
def split(self, string):
- parts = parsing.interpolate(string, self._translator.tales)
+ parts = parsing.interpolate(string, self.translator.tales)
if parts is not None:
return map(
lambda part: isinstance(part, types.expression) and \
@@ -434,3 +400,40 @@
"Semi-colons in string-expressions must be escaped.")
return string.replace(';;', ';')
+
+class PythonTranslator(ExpressionTranslator):
+ """Implements Python expression translation."""
+
+ def validate(self, string):
+ """We use the ``parser`` module to determine if
+ an expression is a valid python expression."""
+
+ if isinstance(string, unicode):
+ string = string.encode('utf-8')
+
+ parser.expr(string.strip())
+
+ def translate(self, string):
+ if isinstance(string, str):
+ string = string.decode('utf-8')
+
+ return types.value(string.strip())
+
+python_translator = PythonTranslator()
+
+class StringTranslator(ExpressionTranslator):
+ """Implements string translation expression."""
+
+ component.adapts(interfaces.IExpressionTranslator)
+
+ re_interpolation = re.compile(r'(?P<prefix>[^\\]\$|^\$)({((?P<expression>.*)})?|'
+ '(?P<variable>[A-Za-z][A-Za-z0-9_]*))')
+
+ def __init__(self, translator):
+ self.translator = translator
+
+ def validate(self, string):
+ self.split(string)
+
+ def translate(self, string):
+ return types.join(self.split(string))
Modified: Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.py
===================================================================
--- Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.py 2008-09-22 16:09:24 UTC (rev 91355)
+++ Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.py 2008-09-22 16:12:44 UTC (rev 91356)
@@ -97,6 +97,18 @@
def cdata(self):
return self.element.meta_cdata
+ @property
+ def text(self):
+ if self.element.text is not None:
+ return self.element.translator.split(self.element.text)
+ return ()
+
+ @property
+ def tail(self):
+ if self.element.tail is not None:
+ return self.element.translator.split(self.element.tail)
+ return ()
+
node = property(node)
@property
Modified: Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.txt
===================================================================
--- Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.txt 2008-09-22 16:09:24 UTC (rev 91355)
+++ Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.txt 2008-09-22 16:12:44 UTC (rev 91356)
@@ -288,3 +288,18 @@
</div>
<BLANKLINE>
</div>
+
+Expression interpolation
+------------------------
+
+The ``chameleon.zpt`` parser supports Genshi interpolation
+expressions.
+
+ >>> print render("""\
+ ... <div xmlns="http://www.w3.org/1999/xhtml"
+ ... xmlns:tal="http://xml.zope.org/namespaces/tal">
+ ... Interpolation ${'expressions'} are ${'convenient'}.
+ ... </div>""")
+ <div>
+ Interpolation expressions are convenient.
+ </div>
Modified: Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/template.txt
===================================================================
--- Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/template.txt 2008-09-22 16:09:24 UTC (rev 91355)
+++ Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/template.txt 2008-09-22 16:12:44 UTC (rev 91356)
@@ -93,3 +93,13 @@
...
TypeError: range expected at least 1 arguments, got 0
+Exception while evaluating interpolation:
+
+ >>> PageTemplate("""\
+ ... <div xmlns="http://www.w3.org/1999/xhtml"
+ ... xmlns:tal="http://xml.zope.org/namespaces/tal">
+ ... <span>${range()}</span>
+ ... </div>""").render()
+ Traceback (most recent call last):
+ ...
+ TypeError: range expected at least 1 arguments, got 0
More information about the Checkins
mailing list