Skip to main content

hehey-htemplate 是一个python 轻量的模板引擎,其主要特点有:易学,示例全,功能全面,html友好标签,编译速度快,易扩展与其他模板引擎对比,其简单易学,速度快(大概1000次编译,800 多毫秒),随时随地编写自己的标签库.

Project description

hehey-htemplate 组件

介绍

hehey-htemplate 是一个python 轻量的模板引擎,其主要特点有:易学,示例全,功能全面,html友好标签,编译速度快,易扩展 与其他模板引擎对比,其简单易学,速度快(大概1000次编译,800 多毫秒),随时随地编写自己的标签库.

功能列表

  • 支持{},以及<> 标签混合使用
  • 支持layout(模板继承) 标签
  • 支持block 模块
  • 支持include 标签
  • 支持if 标签
  • 支持for dict,list 标签
  • 支持注释
  • 支持python 代码标签
  • 支持调用方法
  • 支持加载静态文件
  • 定义变量
  • 支持不解析标签
  • html 标签
  • 自定义过滤器
  • 优化方法的调用方式,支持| 方法,支持定义参数
  • 支持标签,empty
  • 支持导入自定义过滤器
  • 支持导入自定义标签
  • 支持模板文件缓存代码至内存
  • 支持代码缓存过期时间
  • 支持模板后缀自定义
  • js,css,img 标签
  • 提供小物件(widget)

依赖以及版本要求

  • python >= 3.5

安装

  • 直接下载:

  • 命令安装:
pip install hehey-htemplate

基础文件以目录

参数配置

conf = {
        # 模板文件扩展名
        "suffix":'html',
        # 模板文件根路径
        "tplPath":'',
        # 是否开启模板缓存,开启后,会自动缓存代码,加快模板解析的速度
        "onCache": True,
        # 模板缓存文件目录,模板编译的python代码缓存在文件中,缓存文件存储此目录中
        "cachePath":'',
        # 资源地址,比如js,css,img,默认提供static(静态资源路径),res(外部资源,比如上传的文件) 字典key
        "urls" : {},
        # 模板缓存有效期,单位秒,0 表示无有效期
        "timeout" : 3,
        # 表达式起始符
        "expStart" : '{',
        # 表达式结束符
        "expEnd":'}',
        # 结束表达式的结束符比如/ 则完整表达式为{/for} 或end,{endfor}
        "expEndSign" : '/',
        # 是否启用标签规则,开启后,匹配表达式 <import name="eduhome.name.yong" />
        "onTag" : True,
        # 标签起始符
        "tagStart" : '<',
        # 标签结束符
        "tagEnd" : '>',
        # 结束标签结束符号
        "tagEndSign" :'/',
        # 系统标签,默认自动加载sys 表达式,默认标签,书写时无需写入前缀,比如<css href="xxx" />
        "sysTags" : ['sys'],
        # 自定义标签,书写时必须写入前缀,比如 标签名称html,则css 标签的书写规则为: <html:css href="xxx" />
        "customTags" : ['html'],
};

基本示例

  • 快速使用
    index.html 模板文件
<body>

    {if condition="age == 1"}
        <h1>{$age}</h1>
    {elif condition="age == 2"}
        <h1>hello world</h1>
    {else}
        <h1>hehe 小酌一杯</h1>
    {/if}

</body>

index.py 文件

from htemplate.view import View
# 模板配置,请参考<<参数配置>>
conf = {};
view = View(conf);

# 模板数据
data = {
    "age": 3,
}

# 注入模板变量
view.assign('title',"从您的世界路过?")

# index 为模板名称
html = view.fetch('index',data)

自定义过滤器

# 自定义过滤器
from htemplate.view import reg_temp_filter

@reg_temp_filter('css')
def css_filter(self,cssUrl):

    return  '{0}{1}'.format(self.template.urls['static'],cssUrl)

# 过滤所有有风险的字符
@reg_temp_filter()
def safe(self,value):

    value = self.xss(value)

    return value

自定义上下文

# 自定义上下文
from htemplate.view import reg_temp_context

@reg_temp_context()
def django():

    return {"reqeust":{"mok":88}}

标签库


自定义标签库html
from htemplate.tag.Tag import Tag

from htemplate.nodes.BaseNode import BaseNode

class HtmlTag(Tag):

    def __init__(self,template):
        super().__init__(template)
        self.tags = [
            {'name': "css", 'close': False, 'onTag': True},
            {'name': "js", 'close': False, 'onTag': True},
            {'name': "img", 'close': False, 'onTag': True},
            {'name': "select", 'close': False,'onTag':True},
        ]


    # 模板继承
    def _select(self,node_attrs,mainNode:BaseNode):
        #print(node_attrs)

        #attrs = self.parseAttr(node_attrs)
        pass

    def _css(self,node_attrs, mainNode:BaseNode):
        attrs = self.parseAttr(node_attrs)
        href = attrs['href'];
        cssFunc = 'self.call("css","{0}")'.format(href)
        attrs['href'] = '%s';
        attrsHtml = self.buildHtmlAttrs(attrs);
        codeHtml = "'<link {0} />' % ({1})".format(attrsHtml, cssFunc)

        mainNode.writeRawCode(codeHtml, True, True)

    def _js(self,node_attrs, mainNode:BaseNode):
        attrs = self.parseAttr(node_attrs)
        src = attrs['src'];
        jsFunc = 'self.call("js","{0}")'.format(src)
        attrs['src'] = '%s';
        attrsHtml = self.buildHtmlAttrs(attrs);
        codeHtml = "'<script {0} ></script>' % ({1})".format(attrsHtml, jsFunc)

        mainNode.writeRawCode(codeHtml, True, True)

    def _img(self,node_attrs, mainNode:BaseNode):
        attrs = self.parseAttr(node_attrs)
        src = attrs['src'];
        jsFunc = 'self.call("img","{0}")'.format(src)
        attrs['src'] = '%s';
        attrsHtml = self.buildHtmlAttrs(attrs);
        codeHtml = "'<img {0} >' % ({1})".format(attrsHtml, jsFunc)

        mainNode.writeRawCode(codeHtml, True, True)

index.html 模板文件

<body>
<html:css href="css/core.min.css" rel="stylesheet" />
    {if condition="age == 1"}
        <h1>{$age}</h1>
    {elif condition="age == 2"}
        <h1>hello world</h1>
    {else}
        <h1>hehe 小酌一杯</h1>
    {/if}

</body>

标签示例

layout 布局标签

main.html 布局模板文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{title}</title>
    <html:css href="css/core.min.css" rel="stylesheet" />
    <html:js src= "js/dist/core.min.js?v=2.1.4"  />
</head>
<body>
__BODY__


__FOOTER__

</body>
</html>

index.html 模板文件

{layout file="main.html"}
<body>
{if condition="age == 1"}
    <h1>{$age}</h1>
{elif condition="age == 2"}
    <h1>hello world</h1>
{else}
    <h1>hehe 小酌一杯</h1>
{/if}

</body>
加载静态文件
{layout file="main.html"}
<body>

<!-- 以下的标签,需配合过滤器使用,比如css,js,res,img 等等过滤器,需了解过滤器,请查看fileters/common 文件,大量过滤器存放在此文件中 -->

<!-- 加载站点样式 -->
<css href="css/core.min.css" rel="stylesheet" />
<html:css href="css/core.min.css" rel="stylesheet" />

<!-- 加载站点js -->
<js src= "js/dist/core.min.js?v=2.1.4"  />
<html:js src= "js/dist/core.min.js?v=2.1.4"  />

<!-- 加载站点图片 -->
<html:img src="images/bg_jins.png" alt="" />

<!-- 加载站点外部图片,一般为上传图片 -->
<img src="{:res('upload/2018/10/25/xxxx.jpg')}" alt="" />

</body>
if 标签
<!-- 基础标签示例 -->
{layout file="main.html"}
<body>

<!-- 通用if-->
{if condition="age == 1"}
    <h1>{$age}</h1>
{elif condition="age == 2"}
    <h1>hello world</h1>
{else}
    <h1>hehe 小酌一杯</h1>
{/if}

<!-- 非属性if,原始python 格式 -->
{if age == 1}
    <h1>{$age}</h1>
{elif age == 2}
    <h1>hello world</h1>
{else}
    <h1>hehe 小酌一杯</h1>
{/if}


</body>
for 标签

for.html 模板文件

<!-- 遍历标签,for,list,dict示例 -->
{layout file="base.html"}
<body>
<!-- 通用遍历,兼容list,dict -->
{for name="users" index="index" value="user"}
    <div>{user['userid']}</div>
    <div>{user['realName']}</div>
    <div>{:user['realName']|safe}</div>
{/for}


<!-- 非属性遍历,原始python 格式 -->
{for user in users}
    <div>{user['userid']}</div>
    <div>{user['realName']}</div>
    <div>{:user['realName']|safe}</div>
{/for}


<!-- 遍历list -->
{list name="users" index="index" key="key" value="user"}
    <div>自定义序号(默认为0):{index}</div>
    <div>list本身的序号:{key}</div>
    <div>{user['userid']}</div>
    <div>{user['realName']}</div>
    <div>{:user['realName']|safe}</div>
{/list}

<!-- 遍历dict -->
{dict name="stuNames" key="key" value="name"}
    <div>键:{key}</div>
    <div>值:{name}</div>
    <div>安全过滤:{:name|safe}</div>
{/dict}


<!-- 标签格式 -->

<!-- 通用遍历,兼容list,dict -->
<for name="users" index="index" value="user">
    <div>{user['userid']}</div>
    <div>{user['realName']}</div>
    <div>{:user['realName']|safe}</div>
</for>

<!-- 遍历list -->
<list name="users"  value="user">
    <div>{user['userid']}</div>
    <div>{user['realName']}</div>
    <div>{:user['realName']|safe}</div>
</list>

<!-- 遍历dict -->
<dict name="stuNames" key="key" value="name">
    <div>键:{key}</div>
    <div>值:{name}</div>
    <div>安全过滤:{:name|safe}</div>
</dict>

</body>
包含标签(include,import,taglib)
<!-- 基础标签示例 -->
<!-- 导入标签库,建议放在文件的首行 -->
{taglib name="html"}

<!-- 导入python 模块类 -->
{import name="hehe.core.base.BaseController:BaseController"}

<!-- 导入python 模块类,并设置别名 -->
{import name="hehe.core.base.BaseController:BaseController" as="webController"}

<!-- 导入python 模块函数 -->
{import name="hehe.core.base.BaseController:index"}

<body>

{for name="users" index="index" value="user"}
    <div>{user['userid']}</div>
    <div>{user['realName']}</div>
    <div>{:user['realName']|safe}</div>
{/for}

<!-- 导入尾部模板 -->
{include file="footer.html"}

</body>
block块标签
{layout file="main" block="body:__BODY__,footer:__FOOTER__"}

{block name="body"}

    {for name="users" index="index" value="user"}
        <div>{user['userid']}</div>
        <div>{user['realName']}</div>
        <div>{:user['realName']|safe}</div>
    {/for}

{/block}

{block name="footer"}

    {for name="users" index="index" value="user"}
        <div>{user['userid']}</div>
        <div>{user['realName']}</div>
        <div>{:user['realName']|safe}</div>
    {/for}

{/block}

<!-- 直接调用footer block -->
{call name="footer"}
条件标签
{layout file="main.html"}
<body>
{empty name="users"}
    users 变量为空
{else}
    {for name="users" index="index" value="user"}
        <div>{user['userid']}</div>
        <div>{user['realName']}</div>
        <div>{:user['realName']|safe}</div>
    {/for}

{/empty}

{notempty name="users"}
    {for name="users" index="index" value="user"}
        <div>{user['userid']}</div>
        <div>{user['realName']}</div>
        <div>{:user['realName']|safe}</div>
    {/for}
{else}
    users 变量为空
{/notempty}

</body>
python 标签
<!-- python 示例 -->
{layout file="base.html"}
<body>

{for name="users" index="index" value="user"}
    <!-- 定义python 变量,name,char -->
    {set name = "'mnnmd'" char="1"}
    <div>{user['userid']}</div>
    <div>{user['realName']}</div>
    <div>{:user['realName']|safe}</div>
    <div>{name}</div>

    {if condition="index == 1"}
        <!-- 书写原始python  -->
        {raw break}
    {/if}
{/for}

<!--python 原始代码块 -->
{python}
age = 22;
if age > 35:
    print("dddd")
{/python}


<!-- comment python 注释标签 -->
{comment}
 什么垃圾代码,连注释都没有,没办法接手,准备跑路
{/comment}

<!-- pass 不解析模块,由此标签包含的内容,都不解析标签等内容,原样输出 -->
{pass}
 想写什么都可以,反正都不会报错,{nmm},""kksdf<imm>dfdfd</imm>
<for name="sdfdfd">
   sdf;omuynsdfb{$name
</for>
{/pass}


</body>
安全过滤
{layout file="main.html"}
<body>
<!-- $ 代码调用safe 安全方法,比如
{$user['userid']},相当于{:user['userid']|safe}
-->
{for name="users" index="index" value="user"}
    <div>{$user['userid']}</div>
    <div>{user['realName']}</div>
{/for}

</body>
过滤器
{layout file="main.html"}
<body>

<!-- 调用过滤器 -->
{for name="users" value="user"}
    <title>{user['userid']}</title>
    <title>{:user['realName']|len}</title>
{/for}

<!-- 调用带参数过滤器,### 表示当前要过滤的目标值,如参数列表中无###.则默认目标值则放在第一个参数位置 -->
{for name="users" value="user"}
    <title>{user['userid']}</title>
    <title>{:user['ctime']|date='%Y-%m-%d'}</title>
    <title>{:user['ctime']|date=###,'%Y-%m-%d'}</title>
{/for}


<!-- 调用其他非过滤器的方法(strlen 为自定义方法)-->
{for name="users" value="user"}
    <title>{user['userid']}</title>
    <title>{:user['ctime']|date='%Y-%m-%d'}</title>
    <title>{:user['ctime']|strlen}</title>
{/for}


</body>

Project details


Release history Release notifications

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for hehey-htemplate, version 1.0.0
Filename, size File type Python version Upload date Hashes
Filename, size hehey-htemplate-1.0.0.tar.gz (27.9 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page