代码改变世界

mako表达式过滤器(五)

2012-07-27 17:15  ubunoon  阅读(642)  评论(0编辑  收藏  举报

默认支持的有

u - URL

h - HTML

x - XML

trim - string.strip()

entity - HTML entity

unicode - 默认的unicode字符串

decode

n - 取消所有的默认filter

 

多个filter时,用comma(,)隔开,也可以自己定义filter

 

<%!
     def myescape(text):
         return "<TAG>" + text + "</TAG>"
%>

Here's some tagged text : ${"text" | myescape }

自己定义的filter需要为支持一个字符串的参数并且返回过滤后结果。

 

在<%page>标签中使用expression_filter可以为整个页面使用该过滤器。

 

也可以为block和def设置filter

 

<%def name="foo()" filter="h, trim">
    <b>this is bold</b>
</%def>

 

 

在执行

${" results " + somedef() + " more results "}

时会返回(假定somedef返回“somedef's results”字符串)

somedef's results results more results

这是由于somedef()在字符串链接前被全部执行,链接字符串将得到一个空的字符串返回值,为避免该问题,mako有两种方法:

 

<%def name="somedef()" buffered="True">
    somedef's results
</%def>

上面的代码会生成类似下面的代码:

def somedef():
    context.push_buffer()
    try:
        context.write("somedef's results")
    finally:
        buf = context.pop_buffer()
    return buf.getvalue()

或者使用

${" results " + capture(somedef) + " more results "}

capture类似python的apply方法,传递给somedef的参数,可由capture传递给somedef。

 

在使得def更加灵活对待filter,decorator在template中也支持。

 

<%!
    def bar(fn):
        def decorate(context, *args, **kw):
            context.write("BAR")
            fn(*args, **kw)
            context.write("BAR")
            return ''
        return decorate
%>

<%def name="foo()" decorator="bar">
    this is foo
</%def>

${foo()}