⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smartyconvertor.php

📁 FP2 CRM code+Mysql DB
💻 PHP
字号:
<?php/* vim: set expandtab tabstop=4 shiftwidth=4: */// +----------------------------------------------------------------------+// | PHP Version 4                                                        |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2002 The PHP Group                                |// +----------------------------------------------------------------------+// | This source file is subject to version 2.02 of the PHP license,      |// | that is bundled with this package in the file LICENSE, and is        |// | available at through the world-wide-web at                           |// | http://www.php.net/license/2_02.txt.                                 |// | If you did not receive a copy of the PHP license and are unable to   |// | obtain it through the world-wide-web, please send a note to          |// | license@php.net so we can mail you a copy immediately.               |// +----------------------------------------------------------------------+// | Authors:  Alan Knowles <alan@akbkhome.com>                           |// +----------------------------------------------------------------------+//// $Id: SmartyConvertor.php,v 1.3 2004/07/03 03:46:43 alan_k Exp $////  Smarty Conversion compiler//  takes a smarty template, and converts it to a flexy one.//  then does a standard flexy compile.////  anything that is not supported gets changed to HTML comments/* Usage:a simple script: 'convertsmarty.php'#!/usr/bin/php   $file = $_SERVER['argv'][1];   $x = new HTML_Template_Flexy(array(                    'compileDir'    =>  dirname(__FILE__) ,      // where do you want to write to..                    'templateDir'   =>  $dir ,     // where are your templates                    'locale'        => 'en',    // works with gettext                    'forceCompile'  =>  true,  // only suggested for debugging                    'debug'         => false,   // prints a few errors                    'nonHTML'       => false,  // dont parse HTML tags (eg. email templates)                    'allowPHP'      => false,   // allow PHP in template                    'compiler'      => 'SmartyConvertor', // which compiler to use.                    'compileToString' => true,    // returns the converted template (rather than actually                                                    // converting to PHP.                    'filters'       => array(),    // used by regex compiler..                    'numberFormat'  => ",2,'.',','",  // default number format  = eg. 1,200.00 ( {xxx:n} )                    'flexyIgnore'   => 0        // turn on/off the tag to element code                ));        echo $x->compile(basename($file));then run it at the command line:php convertsmarty.php /path/to/a/smarty/template.tpl > /path/to/the/flexy/templates.html*/require_once 'HTML/Template/Flexy/Compiler.php';/*** The Smarty Converter implementation.* designed primarily to be used as above, to convert from one to another.* however it could be used inline to convert simple smarty templates into * flexy ones - then compile them on the fly.** @version    $Id: SmartyConvertor.php,v 1.3 2004/07/03 03:46:43 alan_k Exp $*/class HTML_Template_Flexy_Compiler_SmartyConvertor extends HTML_Template_Flexy_Compiler {        /**    * compile implementation    *    * see HTML_Template_Flexy_Compiler::compile()    *     * @param   object    The core flexy object.    * @param   string    optionally a string to compile.    *    * @return   true | string   string when compiling to String.    * @access   public    */      function compile(&$flexy,$string=false)     {        $data = $string;        if ($string === false) {            $data = file_get_contents($flexy->currentTemplate);        }                                $data = $this->convertToFlexy($data);                if ($flexy->options['compileToString']) {            return $data;        }                require_once 'HTML/Template/Flexy/Compiler/Standard.php';        $flexyCompiler = new HTML_Template_Flexy_Compiler_Standard;        $flexyCompiler->compile($flexy,$data);        return true;    }                /**    * The core work of parsing a smarty template and converting it into flexy.    *    * @param   string       the contents of the smarty template    *    * @return   string         the flexy version of the template.    * @access   public|private    * @see      see also methods.....    */    function convertToFlexy($data)     {            $leftq = preg_quote('{', '!');        $rightq = preg_quote('}', '!');                 preg_match_all("!" . $leftq . "\s*(.*?)\s*" . $rightq . "!s", $data, $matches);        $tags = $matches[1];        // find all the tags/text...        $text = preg_split("!" . $leftq . ".*?" . $rightq . "!s", $data);                $max_text = count($text);        $max_tags = count($tags);                for ($i = 0 ; $i < $max_tags ; $i++) {            $compiled_tags[] = $this->_compileTag($tags[$i]);        }        // error handling for closing tags.                         $data = '';        for ($i = 0; $i < $max_tags; $i++) {            $data .= $text[$i].$compiled_tags[$i];        }        $data .= $text[$i];        return $data;        }        /**    * stack for conditional and closers.    *    * @var array    * @access public    */    var $stack = array(            'if' => 0,        );                /**    * compile a smarty { tag } into a flexy one.    *    * @param   string           the tag    *    * @return   string      the converted version    * @access   private    */    function _compileTag($str)     {        // skip comments        if (($str{0} == '*') && (substr($str,-1,1) == '*')) {            return '';        }                        switch($str{0}) {            case '$':                // its a var                return $this->_convertVar($str);            case '#':                // its a config var                return $this->_convertConfigVar($str);            case '%':                // wtf does this do                return "<!-- what is this? $str -->";        }                                                                    // this is where it gets messy        // this is very slow - but what the hell         //   - its only done once        //   - its alot more readable than a long regext.        //   - it doesnt infringe on copyright...        switch(true) {            case (preg_match('/^config_load\s/', $str)):                // convert to $t->TemplateConfigLoad()                $args = $this->convertAttributesToKeyVal(substr($str,strpos( $str,' ')));                return '{plugin(#smartyConfigLoad#,#'.$args['file'].'#,#'.$args['section'].'#)}';                        case (preg_match('/^include\s/', $str)):                // convert to $t->TemplateConfigLoad()                $args = $this->convertAttributesToKeyVal(substr($str,strpos( $str,' ')));                             return '{plugin(#smartyInclude#,#'.$args['file'].'#)}';                       case ($str == 'ldelim'):                return '{';            case ($str == 'rdelim'):                return '}';                                            case (preg_match('/^if \$(\S+)$/', $str,$matches)):            case (preg_match('/^if \$(\S+)\seq\s""$/', $str,$matches)):                // simple if variable..                // convert to : {if:sssssss}                $this->stack['if']++;                $var =  $this->_convertVar('$'.$matches[1]);                return '{if:'.substr($var,1);                            case (preg_match('/^if #(\S+)#$/', $str,$matches)):            case (preg_match('/^if #(\S+)#\sne\s""$/', $str,$matches)):                // simple if variable..                // convert to : {if:sssssss}                $this->stack['if']++;                $var =  $this->_convertConfigVar('#'.$matches[1].'#');                return '{if:'.substr($var,1);                        // negative matches            case (preg_match('/^if\s!\s\$(\S+)$/', $str,$matches)):            case (preg_match('/^if \$(\S+)\seq\s""$/', $str,$matches)):                // simple if variable..                // convert to : {if:sssssss}                $this->stack['if']++;                $var =  $this->_convertVar('$'.$matches[1]);                return '{if:!'.substr($var,1);                             case ($str == 'else'):                if (!$this->stack['if']) {                    break;                }                return '{else:}';                                            case ($str == '/if'):                if (!$this->stack['if']) {                    break;                }                $this->stack['if']--;                return '{end:}';                                }                return "<!--   UNSUPPORTED TAG: $str FOUND -->";                                    }        /**    * convert a smarty var into a flexy one.    *    * @param   string       the inside of the smart tag    *    * @return   string      a flexy version of it.    * @access   private    */      function _convertVar($str)     {        // look for modfiers first.        $mods = explode('|', $str);        $var = array_shift($mods);        $var = substr($var,1); // strip $                // various formats :        // aaaa.bbbb.cccc => aaaa[bbbb][cccc]        // aaaa[bbbb] => aaa[bbbb]        // aaaa->bbbb => aaaa.bbbb                $bits = explode('.',$var);        $var = array_shift($bits);        foreach($bits as $k) {            $var.= '['.$k .']';        }        $bits = explode('->',$var);        $var = implode('.',$bits);        $mods = implode('|',$mods);                if (strlen($mods)) {            return '{plugin(#smartyModifiers#,'.$var.',#'.$mods.'#):h}';        }        return '{'.$var .'}' . $mods;    }    /**    * convert a smarty key="value" string into a key value array    * cheap and cheerfull - doesnt handle spaces inside the strings...    *    * @param   string       the key value part of the tag..    *    * @return   array      key value array    * @access   private    */    function convertAttributesToKeyVal($str)     {        $atts = explode(' ', $str);        $ret = array();        foreach($atts as $bit) {            $bits = explode('=',$bit);            // loose stuff!!!            if (count($bits) != 2) {                continue;            }            $ret[$bits[0]] = ($bits[1]{0} == '"') ? substr($bits[1],1,-1) : $bits[1];         }        return $ret;    }     /**    * convert a smarty config var into a flexy one.    *    * @param   string       the inside of the smart tag    *    * @return   string      a flexy version of it.    * @access   private    */      function _convertConfigVar($str)     {        $mods = explode('|', $str);        $var = array_shift($mods);        $var = substr($var,1,-1); // strip #'s        $mods = implode('|',$mods);        if (strlen($mods)) {            $mods = "<!-- UNSUPPORTED MODIFIERS: $mods -->";        }        return '{configVars.'.$var .'}' . $mods;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -