Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 自拍偷拍首页,91视频免费网站,99在线播放视频

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Python大神教你300行代碼搞定HTML模板渲染「附源碼」

          、前言

          模板語言由HTML代碼和邏輯控制代碼組成,此處 @PHP 。通過模板語言可以快速的生成預(yù)想的HTML頁面。應(yīng)該算是后端渲染不可缺少的組成部分。

          二、功能介紹

          通過使用學(xué)習(xí) tornado 、 bottle 的模板語言,我也效仿著實(shí)現(xiàn)可以獨(dú)立使用的模板渲染的代碼模塊,模板語法來自 tornadobottle 的語法。可以用來做一些簡(jiǎn)單的事情 網(wǎng)頁渲染郵件內(nèi)容生成 等HTML顯示方面。以下就是簡(jiǎn)單的語法使用介紹。

          1. 變量。使用 {{ }} 包裹起來,里面的變量為Python傳入。模板渲染時(shí)會(huì)將傳入的變量轉(zhuǎn)換成字符串并填入對(duì)應(yīng)位置。

          # 模板文件內(nèi)容
          <title>{{my_title}}</title>
          <label>{{ session.name }}</label>
          # py代碼調(diào)用  t_html 為上面的內(nèi)容
          Template(t_html).render(my_title="標(biāo)題", session = some_obj) 
          

          2. 轉(zhuǎn)義。默認(rèn)傳入的數(shù)據(jù)都會(huì)進(jìn)行HTML轉(zhuǎn)義,可以使用 {% raw value %} 來將value的內(nèi)容按原始字符串輸出。

          # 模板文件內(nèi)容
          <p>{% raw value %} </p>
          # Py調(diào)用內(nèi)容
          Template(t_html).render(my_title="<label>顯示標(biāo)簽</label>")
          

          3. 條件控制。支持Python的 if,elif,else 。條件代碼需要放在 {% %} 內(nèi)部,并且在條件結(jié)束后需要額外增加 {% end %} ,用于標(biāo)識(shí)條件控制語句塊范圍。

          # 模板文件內(nèi)容
          {% if a > 1%}
          <label>A大于1</label>
          {% else %}
          <label>A小于或等于1</label>
          {% end %}
          # py調(diào)用
          Template(t_html).render(a=1)
          

          4. 循環(huán)控制。支持Python的 forwhile 。與條件控制一樣也需要放在 {% %} 內(nèi)部,并且結(jié)束處需要額外增加 {% end %} ,用于標(biāo)識(shí)循環(huán)控制語句塊的范圍。

          # 模板文件內(nèi)容
          {% for i in range(10) %}
            <label>當(dāng)前序號(hào):{{i+1}}</label>
          {% end %}
          # py調(diào)用
          Template(t_html).render()  
          

          5. 變量聲明。如果需要在模板文件內(nèi)聲明一個(gè)變量,方便使用時(shí),可以通過 set 來實(shí)現(xiàn)。具體格式為 {% set v = xx %} 。通過 set 聲明的變量在整個(gè)模板文件中都可以使用,包括在條件控制和循環(huán)控制中作為條件判斷也可以。

          # 模板文件內(nèi)容
          {% set a = 1 %}
          <label>a的值:{{a}}</label>
          

          三、源碼

          這個(gè)模板語言模塊是在 Python2.7 上面開發(fā)使用的,如果要在 Python3+ 上使用需要對(duì) strbytes 進(jìn)行一些處理即可,由于沒有引用任何其他模塊,可以很好地獨(dú)立使用。

            1 # -*- coding:utf-8 -*-
            2 
            3 """ 模板語言"""
            4 
            5 # TOKEN相關(guān)的定義
            6 TOKEN_S_BRACE = "{"
            7 TOKEN_S_BLOCK = "%"
            8 TOKEN_EXPRESSION_L = "{{"  
            9 TOKEN_EXPRESSION_R = "}}"
           10 TOKEN_BLOCK_L = "{%"
           11 TOKEN_BLOCK_R = "%}"
           12 TOKEN_KEY_SET = "set"
           13 TOKEN_KEY_RAW = "raw"
           14 TOKEN_KEY_IF = "if"
           15 TOKEN_KEY_ELIF = "elif"
           16 TOKEN_KEY_ELSE = "else"
           17 TOKEN_KEY_FOR = "for"
           18 TOKEN_KEY_WHILE = "while"
           19 TOKEN_KEY_END = "end"
           20 TOKEN_KEY_BREAK = "break"
           21 TOKEN_KEY_CONTINUE = "continue"
           22 TOKEN_SPACE = " "
           23 TOKEN_COLON = ":"
           24 # Token標(biāo)記 {{}} {% %}
           25 TOKEN_FLAG_SET = {TOKEN_S_BRACE, TOKEN_S_BLOCK}
           26 # 簡(jiǎn)單的語句
           27 TOKEN_KEY_SET_SIMPLE_EXPRESSION = {TOKEN_KEY_SET, TOKEN_KEY_RAW}
           28 # 前置條件
           29 TOKEN_KEY_PRE_CONDITION = {
           30     # end 必須在if/elif/else/for/while 后面
           31     TOKEN_KEY_END: {TOKEN_KEY_IF, TOKEN_KEY_ELIF, TOKEN_KEY_ELSE, 
           32                     TOKEN_KEY_FOR, TOKEN_KEY_WHILE},
           33     # elif 必須在if 后面
           34     TOKEN_KEY_ELIF: {TOKEN_KEY_IF},
           35     # else 必須在if/elif 后面
           36     TOKEN_KEY_ELSE: {TOKEN_KEY_IF, TOKEN_KEY_ELIF, TOKEN_KEY_FOR, TOKEN_KEY_WHILE},
           37 }
           38 # 循環(huán)語句
           39 TOKEN_KEY_LOOP = {TOKEN_KEY_WHILE, TOKEN_KEY_FOR}
           40 # 循環(huán)的控制break continue
           41 TOKEN_KEY_LOOP_CTRL = {TOKEN_KEY_BREAK, TOKEN_KEY_CONTINUE}
           42 
           43 class ParseException(Exception):
           44     pass
           45 
           46 class TemplateCode(object):
           47     def __init__(self):
           48         self.codeTrees = {"parent": None, "nodes": []}
           49         self.cursor = self.codeTrees
           50         self.compiled_code = None
           51 
           52     def create_code(self):
           53         """創(chuàng)建一個(gè)代碼子塊"""
           54         child_codes = {"parent": self.cursor, "nodes": []}
           55         self.cursor["nodes"].append(child_codes)
           56         self.cursor = child_codes
           57 
           58     def close_code(self):
           59         """ 關(guān)閉一個(gè)代碼子塊 """
           60         assert self.cursor["parent"] is not None, "overflow"
           61         self.cursor = self.cursor["parent"]
           62 
           63     def append_text(self, text):
           64         """ 添加文本 """
           65         # 排除空行
           66         self.cursor["nodes"].append("_add(%r)" % text)
           67 
           68     def append_express(self, express, raw=False):
           69         """ 表達(dá)式 """
           70         if raw:
           71             temp_exp = "_t_exp = _str_(%s)" % express
           72         else:
           73             temp_exp = "_t_exp = _esc_(%s)" % express
           74         self.cursor["nodes"].append(temp_exp)
           75         self.cursor["nodes"].append("_add(_t_exp)")
           76 
           77     def append_statement(self, statement):
           78         """ 語句 """
           79         temp_statement = "%s" % statement
           80         self.cursor["nodes"].append(temp_statement)
           81 
           82     def reset(self):
           83         self.codeTrees = {"parent": None, "nodes": []}
           84         self.cursor = self.codeTrees
           85         self.compiled_code = None
           86 
           87     def build_code(self, filename):
           88         temp_code_buff = []
           89         self.write_buff_with_indent(temp_code_buff, "def _template_render():", 0)
           90         self.write_buff_with_indent(temp_code_buff, "_codes = []", 4)
           91         self.write_buff_with_indent(temp_code_buff, "_add = _codes.append", 4)
           92         self.write_codes(temp_code_buff, self.codeTrees, 4)
           93         self.write_buff_with_indent(temp_code_buff, "return ''.join(_codes)", 4)
           94         temp_code = "".join(temp_code_buff)
           95         self.compiled_code = compile(temp_code,filename, "exec", dont_inherit=True)
           96 
           97     def write_codes(self, code_buff, codes, indent):
           98         for node in codes.get("nodes", []):
           99             if isinstance(node, dict):
          100                 self.write_codes(code_buff, node, indent+4)
          101             else:
          102                 self.write_buff_with_indent(code_buff, node, indent)
          103 
          104     def generate(self, **kwargs):
          105         temp_namespace = {}
          106         temp_namespace['_str_'] = self.to_utf8
          107         temp_namespace['_esc_'] = self.to_safe_utf8
          108         temp_namespace.update(kwargs)
          109         exec(self.compiled_code, temp_namespace)
          110         return temp_namespace['_template_render']()
          111 
          112     @staticmethod
          113     def write_buff_with_indent(code_buff, raw_str, indent):
          114         """"""
          115         temp = (" " * indent) + raw_str + "\n"
          116         code_buff.append(temp)
          117 
          118     @staticmethod
          119     def to_utf8(raw_str):
          120         """ 轉(zhuǎn)換 """
          121         if isinstance(raw_str, str):
          122             return raw_str
          123         elif isinstance(raw_str, bytes):
          124             return raw_str.decode()
          125         return str(raw_str)
          126 
          127     @staticmethod
          128     def to_safe_utf8(raw_str):
          129         """ 過濾html轉(zhuǎn)義 """
          130         text = TemplateCode.to_utf8(raw_str)
          131         return text.replace("&", "&").replace("<", "<").replace(">", ">")
          132 class Template(object):
          133     """模板類"""
          134     def __init__(self, input_obj,filename="<string>", **namespace):
          135         """模板初始化"""
          136         self.namespace = {}
          137         self.namespace.update(namespace)
          138         # 將數(shù)據(jù)丟進(jìn)去解析生成編譯代碼
          139         self.lexer = TemplateLexer(input_obj, filename)
          140 
          141     def render(self, **kwargs):
          142         """渲染模板 """
          143         temp_name_space = {}
          144         temp_name_space.update(self.namespace)
          145         temp_name_space.update(kwargs)
          146         # 執(zhí)行渲染
          147         return self.lexer.render(**kwargs)
          148 
          149 class TemplateLexer(object):
          150     """模板語法分析器 """
          151     def __init__(self, input_obb, filename="<string>"):
          152         if hasattr(input_obb, "read"):
          153             self.raw_string = input_obb.read()
          154         else:
          155             self.raw_string = input_obb
          156         self.filename = filename
          157         # 記錄當(dāng)前的位置
          158         self.pos = 0
          159         # 記錄原始數(shù)據(jù)的總長(zhǎng)度
          160         self.raw_str_len = len(self.raw_string)
          161         # 記錄解析的數(shù)據(jù)
          162         self.code_data = TemplateCode()
          163         # 開始解析
          164         self.parse_template()
          165 
          166     def match(self, keyword, pos=None):
          167         return self.raw_string.find(keyword, pos if pos is not None else self.pos)
          168 
          169     def cut(self, size=-1):
          170         """剪取數(shù)據(jù) size切割數(shù)據(jù)的大小,-1表示全部"""
          171         if size == -1:
          172             new_pos = self.raw_str_len
          173         else:
          174             new_pos = self.pos + size
          175         s = self.raw_string[self.pos: new_pos]
          176         self.pos = new_pos
          177         return s
          178 
          179     def remaining(self):
          180         """獲取剩余大小 """
          181         return self.raw_str_len - self.pos
          182 
          183     def function_brace(self):
          184         """ 獲取{{  / {% """
          185         skip_index = self.pos
          186         while True:
          187             index = self.match(TOKEN_S_BRACE, skip_index)  # {% {{
          188             # 沒找到
          189             if index == -1:
          190                 return None, -1
          191             # 末尾
          192             if index >= self.raw_str_len:
          193                 return None, -1
          194             # 匹配類型
          195             next_value = self.raw_string[index + 1:index + 2]
          196             if next_value not in TOKEN_FLAG_SET:
          197                 skip_index = index + 1
          198                 # 說明不是關(guān)鍵類型
          199                 continue
          200             brace = self.raw_string[index: index + 2]
          201             return brace, index
          202         return None, -1
          203 
          204     def read_content_with_token(self, index, begin_token, end_token):
          205         """
          206         讀取匹配token的內(nèi)容
          207         """
          208         end_index = self.match(end_token)
          209         if end_index == -1:
          210             return ParseException("{0} missing end token {1}".format(begin_token, end_token))
          211         # 過濾 begin_token
          212         self.pos = index + len(begin_token)
          213         content = self.cut(end_index - self.pos)
          214         # 去除末尾 end_token
          215         self.cut(len(end_token))
          216         return content
          217 
          218     def add_simple_block_statement(self, operator, suffix):
          219         if not suffix:
          220             raise ParseException("{0} missing content".format(operator))
          221         if operator == TOKEN_KEY_SET:
          222             self.code_data.append_statement(suffix)
          223         elif operator == TOKEN_KEY_RAW:
          224             self.code_data.append_express(suffix, True)
          225         else:
          226             raise ParseException("{0} is undefined".format(operator))
          227 
          228     def parse_template(self):
          229         """解析模板 """
          230         # TODO 檢查模板文件是否更改過,如果沒有則不需要重新解析
          231         self.code_data.reset()
          232         # 解析模板原文件
          233         self.__parse()
          234         # 生成編譯code
          235         self.__compiled_code()
          236 
          237     def render(self, **kwargs):
          238         return self.code_data.generate(**kwargs)
          239 
          240     def __parse(self, control_operator=None, in_loop=False):
          241         """開始解析"""
          242         while True:
          243             if self.remaining() <= 0:
          244                 if control_operator or in_loop:
          245                     raise ParseException("%s missing {%% end %%}" % control_operator)
          246                 break
          247             # 讀取 {{ {%
          248             brace, index = self.function_brace()
          249             # 說明沒有找到
          250             if not brace:
          251                 text = self.cut(index)
          252                 self.code_data.append_text(text)
          253                 continue
          254             else:
          255                 text = self.cut(index - self.pos)
          256                 if text:
          257                     self.code_data.append_text(text)
          258 
          259             if brace == TOKEN_EXPRESSION_L:
          260                 content = self.read_content_with_token(index, TOKEN_EXPRESSION_L, TOKEN_EXPRESSION_R).strip()
          261                 if not content:
          262                     raise ParseException("Empty Express")
          263                 self.code_data.append_express(content)
          264                 continue
          265             elif brace == TOKEN_BLOCK_L:
          266                 content = self.read_content_with_token(index, TOKEN_BLOCK_L, TOKEN_BLOCK_R).strip()
          267                 if not content:
          268                     raise ParseException("Empty block")
          269 
          270                 # 得到表達(dá)式 for x in x ;  if x ;  elif x ;  else ;  end ;  set ;  while x ;
          271                 operator, _, suffix = content.partition(TOKEN_SPACE)
          272                 if not operator:
          273                     raise ParseException("block missing operator")
          274 
          275                 suffix = suffix.strip()
          276                 # 簡(jiǎn)單語句,set / raw
          277                 if operator in TOKEN_KEY_SET_SIMPLE_EXPRESSION:
          278                     self.add_simple_block_statement(operator, suffix)
          279                 elif operator in TOKEN_KEY_LOOP_CTRL:
          280                     if not in_loop:
          281                         raise ParseException("{0} must in loop block".format(operator))
          282                     self.code_data.append_statement(operator)
          283                 else:
          284                     # 控制語句 檢查匹配if 后面可以跟elif/else
          285                     pre_condition = TOKEN_KEY_PRE_CONDITION.get(operator, None)
          286                     if pre_condition:
          287                         # 里面就是elif/else/end
          288                         if control_operator not in pre_condition:
          289                             raise ParseException("{0} must behind with {1}".format(operator, pre_condition))
          290                         elif operator == TOKEN_KEY_END:
          291                             # 遇到{% end %}則結(jié)束
          292                             self.code_data.close_code()
          293                             return
          294                         else:
          295                             # 由于是依據(jù)if 進(jìn)入 來計(jì)算elif ,因此elif與if是同級(jí)的
          296                             self.code_data.close_code()
          297                             self.code_data.append_statement(content + TOKEN_COLON)
          298                             self.code_data.create_code()
          299                             self.__parse(operator, in_loop or (operator in TOKEN_KEY_LOOP))
          300                             break
          301                     # 添加控制語句及內(nèi)部語句體 if for while
          302                     self.code_data.append_statement(content + TOKEN_COLON)
          303                     self.code_data.create_code()
          304                     self.__parse(operator, in_loop or (operator in TOKEN_KEY_LOOP))
          305             else:
          306                 raise ParseException("Unkown brace")
          307         return
          308 
          309     def __compiled_code(self):
          310         """生成 編譯code """
          311         self.code_data.build_code(self.filename)
          312 if __name__ == "__main__":
          313         t = Template("<html>{{hello}}</html>")
          314         t.render(hello="你好"

          原文鏈接:
          http://www.cnblogs.com/jeffxun/p/15585073.html

          家好,今天給大家介紹一款, 一組12個(gè)文字動(dòng)畫特效html頁面源碼,(圖1)。送給大家哦,獲取方式在本文末尾。

          圖1

          每款都有獨(dú)立的動(dòng)畫(圖2)

          圖2

          每個(gè)動(dòng)畫都可以按重播按鈕重復(fù)播放(圖3)

          圖3

          源碼完整,需要的朋友可以下載學(xué)習(xí)(圖4)

          圖5

          本源碼編碼:10177,需要的朋友,點(diǎn)擊下面的鏈接后,搜索10177,即可獲取。

          「鏈接」

          板編號(hào):mui271

          適合行業(yè):物聯(lián)網(wǎng)

          建站特色:不需要技術(shù)基礎(chǔ)、可安裝到自己的服務(wù)器、2天快速上線

          模板特色:響應(yīng)式(可以自適應(yīng)電腦、手機(jī)、平板終端)、可視化編輯、顏色可以自行調(diào)整、開發(fā)源代碼、可安裝到自己的服務(wù)器、全站內(nèi)置SEO機(jī)制

          系統(tǒng)后臺(tái):米拓企業(yè)建站系統(tǒng)

          建站教程:0基礎(chǔ)建站及網(wǎng)站推廣

          米拓建站“高端、快速、開源”的詳細(xì)介紹:

          1、高端:響應(yīng)式、純手工、SEO、功能完善、偽靜態(tài)、多語言、安全穩(wěn)定、在線升級(jí)都是高端的內(nèi)涵。米拓建站使用標(biāo)準(zhǔn)化、純手工制作的高端響應(yīng)式網(wǎng)站模板,自適應(yīng)電腦、平板、手機(jī)等瀏覽器終端,代碼規(guī)范(感興趣的朋友可以查看網(wǎng)頁源代碼和傳統(tǒng)自助建站及其他定制網(wǎng)站等進(jìn)行對(duì)比),非常適合SEO搜索引擎優(yōu)化,配合米拓企業(yè)建站系統(tǒng)后臺(tái)使用,功能完善,安全穩(wěn)定,支持在線升級(jí)系統(tǒng)和模板,網(wǎng)站搭建后操作方便、維護(hù)簡(jiǎn)單、完全穩(wěn)定、升級(jí)便捷。

          2、快速:包含兩個(gè)方面的內(nèi)容,一是網(wǎng)站搭建快速,用戶可以在米拓官網(wǎng)注冊(cè)賬號(hào)一鍵開通網(wǎng)站,5分鐘上線,同時(shí)用戶也可以在購買網(wǎng)站模板和程序后下載源碼快速安裝到自己的服務(wù)器;二是網(wǎng)站上線后內(nèi)容添加快速,米拓企業(yè)建站系統(tǒng)支持可視化編輯,用戶選擇一套中意的模板數(shù)據(jù)開通網(wǎng)站后,可以快速編輯網(wǎng)站內(nèi)容和圖片,真正意義上實(shí)現(xiàn)哪里不會(huì)點(diǎn)哪里,傻瓜式操作管理網(wǎng)站。

          3、開源:一次性付款(響應(yīng)式模板僅需499元),提供所有源代碼,可安裝到自己的服務(wù)器永久使用。區(qū)別于傳統(tǒng)自助建站和模板建站,米拓建站的網(wǎng)站模板是100%開源,用戶購買后可以直接下載模板和后臺(tái)源碼,安裝到自己的服務(wù)器,如果懂技術(shù)還可以自行修改使之個(gè)性化。


          主站蜘蛛池模板: 午夜性色一区二区三区不卡视频| 波多野结衣av高清一区二区三区| 日本不卡一区二区视频a| 亚洲AV综合色区无码一区爱AV| 国产精品福利一区二区久久| 久久精品国产一区二区| 国产成人一区二区精品非洲| 亚洲一区二区三区91| 中文字幕一区二区三区乱码| av一区二区三区人妻少妇| 亚洲视频一区调教| 国产成人精品无码一区二区三区| 国产在线观看一区二区三区四区| 农村乱人伦一区二区| 日韩A无码AV一区二区三区 | 精品一区二区三区在线播放| 中文字幕日韩一区二区不卡| 成人中文字幕一区二区三区| 日本在线一区二区| 无码人妻一区二区三区在线| 三上悠亚精品一区二区久久| 日韩一区二区三区不卡视频 | 国产激情无码一区二区app| 久久婷婷色综合一区二区| av无码一区二区三区| 国产精品区AV一区二区| 综合久久久久久中文字幕亚洲国产国产综合一区首| 国产av成人一区二区三区| 亚洲线精品一区二区三区影音先锋| 精品亚洲一区二区三区在线观看 | 99久久综合狠狠综合久久一区| 久久精品道一区二区三区| 无码精品人妻一区二区三区人妻斩 | 中文字幕亚洲一区| 亚洲AV无码一区二区乱孑伦AS | 亚洲一区二区三区四区视频| 亚洲一区二区三区高清不卡| 亚洲日本va一区二区三区| 波多野结衣中文一区| 久久久久国产一区二区三区| 亚洲视频一区调教|