[CPyUG:47366] 关于模板

classic Classic list List threaded Threaded
12 messages Options
Reply | Threaded
Open this post in threaded view
|

[CPyUG:47366] 关于模板

Gerald Lee-2
我的系统不是web的,以前出的统计报告是文本方式的,后来客户说统计信息不容易查看,我尝试着改为html样式,结果客户喜欢的不得了,现在客户都要求必须是html样式了。由于我们系统中统计部分估计得有几十个地方,每个地方的统计信息是不一样的,现在只是尝试性的做了几个地方,感觉html的代码量编写很大,有没有合适的模板可以推荐一下使用?
由于我的python是嵌入在C++程序里面的,所以要求模板轻巧,支持循环特性。

--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---

Reply | Threaded
Open this post in threaded view
|

[CPyUG:47370] Re: 关于模板

number5


2008/4/15 Gerald Lee <[hidden email]>:
我的系统不是web的,以前出的统计报告是文本方式的,后来客户说统计信息不容易查看,我尝试着改为html样式,结果客户喜欢的不得了,现在客户都要求必须是html样式了。由于我们系统中统计部分估计得有几十个地方,每个地方的统计信息是不一样的,现在只是尝试性的做了几个地方,感觉html的代码量编写很大,有没有合适的模板可以推荐一下使用?
由于我的python是嵌入在C++程序里面的,所以要求模板轻巧,支持循环特性。


推荐Mako
http://www.makotemplates.org/

其实就算直接用string 替换也问题不大,你就生成静态html给他们看得了



--
simple is good
http://brucewang.net
http://io.brucewang.net
http://twitter.com/number5
skype: number5
--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---

Reply | Threaded
Open this post in threaded view
|

[CPyUG:47372] Re: 关于模板

limodou
In reply to this post by Gerald Lee-2
2008/4/15 Gerald Lee <[hidden email]>:
> 我的系统不是web的,以前出的统计报告是文本方式的,后来客户说统计信息不容易查看,我尝试着改为html样式,结果客户喜欢的不得了,现在客户都要求必须是html样式了。由于我们系统中统计部分估计得有几十个地方,每个地方的统计信息是不一样的,现在只是尝试性的做了几个地方,感觉html的代码量编写很大,有没有合适的模板可以推荐一下使用?
>  由于我的python是嵌入在C++程序里面的,所以要求模板轻巧,支持循环特性。
>
web2py的也可以。不过可能要改造一下。

--
I like python!
UliPad <<The Python Editor>>: http://code.google.com/p/ulipad/
meide <<wxPython UI module>>: http://code.google.com/p/meide/
My Blog: http://www.donews.net/limodou

--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---

Reply | Threaded
Open this post in threaded view
|

[CPyUG:47377] Re: 关于模板

Leo Jay
In reply to this post by Gerald Lee-2
2008/4/15 Gerald Lee <[hidden email]>:
> 我的系统不是web的,以前出的统计报告是文本方式的,后来客户说统计信息不容易查看,我尝试着改为html样式,结果客户喜欢的不得了,现在客户都要求必须是html样式了。由于我们系统中统计部分估计得有几十个地方,每个地方的统计信息是不一样的,现在只是尝试性的做了几个地方,感觉html的代码量编写很大,有没有合适的模板可以推荐一下使用?
>  由于我的python是嵌入在C++程序里面的,所以要求模板轻巧,支持循环特性。
>

python自带的string.Template也很好用。

--
Best Regards,
Leo Jay

--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---

Reply | Threaded
Open this post in threaded view
|

[CPyUG:47382] Re: 关于模板

limodou
2008/4/15 Leo Jay <[hidden email]>:
> 2008/4/15 Gerald Lee <[hidden email]>:
>
> > 我的系统不是web的,以前出的统计报告是文本方式的,后来客户说统计信息不容易查看,我尝试着改为html样式,结果客户喜欢的不得了,现在客户都要求必须是html样式了。由于我们系统中统计部分估计得有几十个地方,每个地方的统计信息是不一样的,现在只是尝试性的做了几个地方,感觉html的代码量编写很大,有没有合适的模板可以推荐一下使用?
>  >  由于我的python是嵌入在C++程序里面的,所以要求模板轻巧,支持循环特性。
>  >
>
>  python自带的string.Template也很好用。
>
不能循环和嵌入代码啊。只是简单。

--
I like python!
UliPad <<The Python Editor>>: http://code.google.com/p/ulipad/
meide <<wxPython UI module>>: http://code.google.com/p/meide/
My Blog: http://www.donews.net/limodou

--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---

vcc
Reply | Threaded
Open this post in threaded view
|

[CPyUG:47388] Re: 关于模板

vcc
In reply to this post by Gerald Lee-2
----- Original Message -----
From: "Gerald Lee" <[hidden email]>
To: <[hidden email]>
Sent: Tuesday, April 15, 2008 10:26 AM
Subject: [CPyUG:47366] 关于模板


> 我的系统不是web的,以前出的统计报告是文本方式的,后来客户说统计信息不容易查看,我尝试着改为html样式,结果客户喜欢的不得了,现在客户都要求必须是html样式了。由于我们系统中统计部分估计得有几十个地方,每个地方的统计信息是不一样的,现在只是尝试性的做了几个地方,感觉html的代码量编写很大,有没有合适的模板可以推荐一下使用?
> 由于我的python是嵌入在C++程序里面的,所以要求模板轻巧,支持循环特性。
>

Jinja <http://jinja.pocoo.org/>,仿Django的模板系统,多了很多编程特性,应该很适合。

vcc
_
http://pk3k.cn - 新Python,新人生 ^_^




--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---

Reply | Threaded
Open this post in threaded view
|

[CPyUG:47402] Re: 关于模板

Gerald Lee-2
In reply to this post by number5
在 08-4-15,Bruce Wang<[hidden email]> 写道:

>
>
> 2008/4/15 Gerald Lee <[hidden email]>:
> >
> 我的系统不是web的,以前出的统计报告是文本方式的,后来客户说统计信息不容易查看,我尝试着改为html样式,结果客户喜欢的不得了,现在客户都要求必须是html样式了。由于我们系统中统计部分估计得有几十个地方,每个地方的统计信息是不一样的,现在只是尝试性的做了几个地方,感觉html的代码量编写很大,有没有合适的模板可以推荐一下使用?
> > 由于我的python是嵌入在C++程序里面的,所以要求模板轻巧,支持循环特性。
> >
> >
>
> 推荐Mako
> http://www.makotemplates.org/
>
> 其实就算直接用string 替换也问题不大,你就生成静态html给他们看得了
>

多谢多谢,他的语法方式我不太喜欢

>
>
> --
> simple is good
> http://brucewang.net
>  http://io.brucewang.net
> http://twitter.com/number5
> skype: number5

--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---

Reply | Threaded
Open this post in threaded view
|

[CPyUG:47403] Re: 关于模板

Gerald Lee-2
In reply to this post by vcc
多谢多谢。

这些模板我看了一眼,感觉对我来说还是比较重量级的,看来可以先考虑一下系统的string.Template,循环部分的代码手工生成也可以,毕竟循环的代码就是很简单的。


在 08-4-15,vcc<[hidden email]> 写道:

> ----- Original Message -----
>  From: "Gerald Lee" <[hidden email]>
>  To: <[hidden email]>
>  Sent: Tuesday, April 15, 2008 10:26 AM
>  Subject: [CPyUG:47366] 关于模板
>
>
>  > 我的系统不是web的,以前出的统计报告是文本方式的,后来客户说统计信息不容易查看,我尝试着改为html样式,结果客户喜欢的不得了,现在客户都要求必须是html样式了。由于我们系统中统计部分估计得有几十个地方,每个地方的统计信息是不一样的,现在只是尝试性的做了几个地方,感觉html的代码量编写很大,有没有合适的模板可以推荐一下使用?
>  > 由于我的python是嵌入在C++程序里面的,所以要求模板轻巧,支持循环特性。
>  >
>
>
> Jinja <http://jinja.pocoo.org/>,仿Django的模板系统,多了很多编程特性,应该很适合。
>
>
>  vcc
>  _
>  http://pk3k.cn - 新Python,新人生 ^_^
>
>
>
>
>
>  >
>

--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---

Reply | Threaded
Open this post in threaded view
|

[CPyUG:47409] Re: 关于模板

boostpy2005@yahoo.com.cn
> 这些模板我看了一眼,感觉对我来说还是比较重量级的,看来可以先考虑一下系统的string.Template,循环部分的代码手工生成也可以,毕竟循环的代码就是很简单的。
有轻的, simpleTAL, 是来自ZOPE的模版。
--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---

Reply | Threaded
Open this post in threaded view
|

[CPyUG:47601] Re: 关于模板

Mr Shore
In reply to this post by Gerald Lee-2
上个string.Template的use case?

在08-4-15,Gerald Lee <[hidden email]> 写道:
多谢多谢。

这些模板我看了一眼,感觉对我来说还是比较重量级的,看来可以先考虑一下系统的string.Template,循环部分的代码手工生成也可以,毕竟循环的代码就是很简单的。


在 08-4-15,vcc<[hidden email]> 写道:

> ----- Original Message -----
>  From: "Gerald Lee" <[hidden email]>
>  To: <[hidden email]>
>  Sent: Tuesday, April 15, 2008 10:26 AM
>  Subject: [CPyUG:47366] 关于模板
>
>
>  > 我的系统不是web的,以前出的统计报告是文本方式的,后来客户说统计信息不容易查看,我尝试着改为html样式,结果客户喜欢的不得了,现在客户都要求必须是html样式了。由于我们系统中统计部分估计得有几十个地方,每个地方的统计信息是不一样的,现在只是尝试性的做了几个地方,感觉html的代码量编写很大,有没有合适的模板可以推荐一下使用?
>  > 由于我的python是嵌入在C++程序里面的,所以要求模板轻巧,支持循环特性。
>  >
>
>
> Jinja <http://jinja.pocoo.org/>,仿Django的模板系统,多了很多编程特性,应该很适合。
>
>
>  vcc
>  _
>  http://pk3k.cn - 新Python,新人生 ^_^
>
>
>
>
>
>  >
>


--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---

Reply | Threaded
Open this post in threaded view
|

[CPyUG:47604] Re: 关于模板

limodou
2008/4/16 Mr Shore <[hidden email]>:
> 上个string.Template的use case?
>
附件是我改造的web2py的模块,它可以直接嵌入简单的python代码。具体模板参见
http://mdp.cti.depaul.edu/examples/default/examples
的示例16-23,不过因为简单,不支持文件之间的相互引用,包括extend,
include等。只能对文本模板进行渲染。因此如果你要处理文件,在使用前先要把内容读出来。

--
I like python!
UliPad <<The Python Editor>>: http://code.google.com/p/ulipad/
meide <<wxPython UI module>>: http://code.google.com/p/meide/
My Blog: http://www.donews.net/limodou

--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---


##################################################################################
#  Author: limodou
#  This file modified from web2py tmplate.py(which is part of web2py Web Framework,
#  and the author is Massimo Di Pierro <[hidden email]>)
#  License: GPL v2
##################################################################################

import re

__all__=['template']

re_write=re.compile('\{\{=(?P<value>.*?)\}\}',re.DOTALL)
re_html=re.compile('\}\}.*?\{\{',re.DOTALL)
#re_strings=re.compile('((?:""").*?(?:"""))|'+"((?:''').*?(?:'''))"+'((?:""").*?(?:"""))|'+"((?:''').*?(?:'''))"

PY_STRING_LITERAL_RE= r'(?P<name>'+ \
  r"[uU]?[rR]?(?:'''(?:[^']|'{1,2}(?!'))*''')|" +\
              r"(?:'(?:[^'\\]|\\.)*')|" +\
            r'(?:"""(?:[^"]|"{1,2}(?!"))*""")|'+ \
              r'(?:"(?:[^"\\]|\\.)*"))'
re_strings=re.compile(PY_STRING_LITERAL_RE,re.DOTALL)

def reindent(text):
    lines=text.split('\n')
    new_lines=[]
    credit=k=0
    for raw_line in lines:
        line=raw_line.strip()
        if line[:5]=='elif ' or line[:5]=='else:' or    \
            line[:7]=='except:' or line[:7]=='except ' or \
            line[:7]=='finally:':
                k=k+credit-1
        if k<0: k=0
        new_lines.append('    '*k+line)
        credit=0
        if line=='pass' or line[:5]=='pass ':
            credit=0
            k-=1
        if line=='return' or line[:7]=='return ' or \
            line=='continue' or line[:9]=='continue ' or \
            line=='break' or line[:6]=='break':
            credit=1
            k-=1
        if line[-1:]==':' or line[:3]=='if ':
            k+=1
    text='\n'.join(new_lines)
    return text

def replace(regex,text,f):
    i=0
    output=[]
    for item in regex.finditer(text):
        output.append(text[i:item.start()])
        output.append(f(item.group()))
        i=item.end()
    output.append(text[i:len(text)])
    return ''.join(output)

def template(text, vars={}, env={}):
    if not isinstance(text, (str, unicode)):
        text = text.read()

    text = '}}%s{{' % re_write.sub('{{out.write(\g<value>)}}', text)
    text = replace(re_html, text, lambda x: '\nout.write(%s,escape=False)\n' % repr(x[2:-2]))
    text = replace(re_strings, text, lambda x: x.replace('\n','\\n'))
    code = reindent(text)
    return _run(code, vars, env)

import StringIO
import cgi

class Out(object):
    def __init__(self):
        self.buf = StringIO.StringIO()

    def write(self, text, escape=True):
        if escape:
            self.buf.write(self.xmlescape(text))
        else:
            self.buf.write(text)
           
    def noescape(self, text):
        self.write(text, escape=False)
       
    def json(self, text):
        from datawrap import dumps
        self.write(dumps(text))

    def xmlescape(self, data, quote=False):
        try:
            data = data.xml()
        except AttributeError:
            if not isinstance(data, (str, unicode)):
                data = str(data)
            if isinstance(data, unicode):
                data = data.encode("utf8","xmlcharrefreplace")
            data = cgi.escape(data, quote)
        return data

    def getvalue(self):
        return self.buf.getvalue()

def _run(code, locals={}, env={}):
    locals['out'] = out = Out()
   
    if isinstance(code, (str, unicode)):
        code = compile(code, 'file', 'exec')
    exec code in env, locals
    return out.getvalue()

def test():
    """
   
    >>> t = "hello, {{=name}}"
    >>> print template(t, {'name':'<limodou>'})
    hello, &lt;limodou&gt;
    >>> t = "{{if name:}}hello, {{=name}}{{else:}}no user{{pass}}"
    >>> print template(t, {'name':''})
    no user
    >>> print template(t, {'name':'limodou'})
    hello, limodou
    """
   
if __name__=='__main__':
    import doctest
    doctest.testmod()
#    a = """
#{{
#def editfile(path,file):
#    ext=os.path.splitext(file)[1]
#    if ext in ['.py', '.css', '.js', '.html']: return A('edit',_href=URL(r=request,f='edit/%s/%s/%s' % (app, path, file)))
#    else: return ''
#    pass
#def htmleditfile(path,file):
#    return A('htmledit')
#}}
#    """
#    print template(a)
Reply | Threaded
Open this post in threaded view
|

[CPyUG:47606] Re: 关于模板

Mr Shore
use case的精髓是短小。。

在08-4-16,limodou <[hidden email]> 写道:
2008/4/16 Mr Shore <[hidden email]>:
> 上个string.Template的use case?
>
附件是我改造的web2py的模块,它可以直接嵌入简单的python代码。具体模板参见
http://mdp.cti.depaul.edu/examples/default/examples
的示例16-23,不过因为简单,不支持文件之间的相互引用,包括extend,
include等。只能对文本模板进行渲染。因此如果你要处理文件,在使用前先要把内容读出来。


--
I like python!
UliPad <<The Python Editor>>: http://code.google.com/p/ulipad/
meide <<wxPython UI module>>: http://code.google.com/p/meide/
My Blog: http://www.donews.net/limodou

#  Author: limodou
#  This file modified from web2py tmplate.py(which is part of web2py Web Framework,
#  and the author is Massimo Di Pierro <[hidden email]>)
#  License: GPL v2
##################################################################################

import re

__all__=['template']

re_write=re.compile('\{\{=(?P<value>.*?)\}\}',re.DOTALL)
re_html=re.compile('\}\}.*?\{\{',re.DOTALL)
#re_strings=re.compile('((?:""").*?(?:"""))|'+"((?:''').*?(?:'''))"+'((?:""").*?(?:"""))|'+"((?:''').*?(?:'''))"

PY_STRING_LITERAL_RE= r'(?P<name>'+ \
  r"[uU]?[rR]?(?:'''(?:[^']|'{1,2}(?!'))*''')|" +\
              r"(?:'(?:[^'\\]|\\.)*')|" +\
            r'(?:"""(?:[^"]|"{1,2}(?!"))*""")|'+ \
              r'(?:"(?:[^"\\]|\\.)*"))'
re_strings=re.compile(PY_STRING_LITERAL_RE,re.DOTALL)

def reindent(text):
    lines=text.split('\n')
    new_lines=[]
    credit=k=0
    for raw_line in lines:
        line=raw_line.strip()
        if line[:5]=='elif ' or line[:5]=='else:' or    \
            line[:7]=='except:' or line[:7]=='except ' or \
            line[:7]=='finally:':
                k=k+credit-1
        if k<0: k=0
        new_lines.append('    '*k+line)
        credit=0
        if line=='pass' or line[:5]=='pass ':
            credit=0
            k-=1
        if line=='return' or line[:7]=='return ' or \
            line=='continue' or line[:9]=='continue ' or \
            line=='break' or line[:6]=='break':
            credit=1
            k-=1
        if line[-1:]==':' or line[:3]=='if ':
            k+=1
    text='\n'.join(new_lines)
    return text

def replace(regex,text,f):
    i=0
    output=[]
    for item in regex.finditer(text):
        output.append(text[i:item.start()])
        output.append(f(item.group()))
        i=item.end()
    output.append(text[i:len(text)])
    return ''.join(output)

def template(text, vars={}, env={}):
    if not isinstance(text, (str, unicode)):
        text = text.read()

    text = '}}%s{{' % re_write.sub('{{out.write(\g<value>)}}', text)
    text = replace(re_html, text, lambda x: '\nout.write(%s,escape=False)\n' % repr(x[2:-2]))
    text = replace(re_strings, text, lambda x: x.replace('\n','\\n'))
    code = reindent(text)
    return _run(code, vars, env)

import StringIO
import cgi

class Out(object):
    def __init__(self):
        self.buf = StringIO.StringIO()

    def write(self, text, escape=True):
        if escape:
            self.buf.write(self.xmlescape(text))
        else:
            self.buf.write(text)

    def noescape(self, text):
        self.write(text, escape=False)

    def json(self, text):
        from datawrap import dumps
        self.write(dumps(text))

    def xmlescape(self, data, quote=False):
        try:
            data = data.xml()
        except AttributeError:
            if not isinstance(data, (str, unicode)):
                data = str(data)
            if isinstance(data, unicode):
                data = data.encode("utf8","xmlcharrefreplace")
            data = cgi.escape(data, quote)
        return data

    def getvalue(self):
        return self.buf.getvalue()

def _run(code, locals={}, env={}):
    locals['out'] = out = Out()

    if isinstance(code, (str, unicode)):
        code = compile(code, 'file', 'exec')
    exec code in env, locals
    return out.getvalue()

def test():
    """

    >>> t = "hello, {{=name}}"
    >>> print template(t, {'name':'<limodou>'})
    hello, &lt;limodou&gt;
    >>> t = "{{if name:}}hello, {{=name}}{{else:}}no user{{pass}}"
    >>> print template(t, {'name':''})
    no user
    >>> print template(t, {'name':'limodou'})
    hello, limodou
    """

if __name__=='__main__':
    import doctest
    doctest.testmod()
#    a = """
#{{
#def editfile(path,file):
#    ext=os.path.splitext(file)[1]
#    if ext in ['.py', '.css', '.js', '.html']: return A('edit',_href=URL(r=request,f='edit/%s/%s/%s' % (app, path, file)))
#    else: return ''
#    pass
#def htmleditfile(path,file):
#    return A('htmledit')
#}}
#    """
#    print template(a)



--~--~---------~--~----~------------~-------~--~----~
来自: `python-cn`~ChinesePythonUserGroup 列表
发言: [hidden email] | 退订: [hidden email]
详情: http://groups.google.com/group/python-cn
-~----------~----~----~----~------~----~------~--~---