JsTemplate.php
[Pman.Core] / JsTemplate.php
1 <?php
2 /***
3  *
4  * usage:
5  *
6  * just need to add this to HTML
7  *
8  * <script src="{baseURL}/Core/JsTemplate.js">
9  *
10  * 
11  *
12  * 
13  *
14  * first part should return a list of files to include.
15  * $x = new Pman_Core_JsTemplate($cfg)
16  *
17  * $x->to
18  *
19  * second part should compile and deliver.
20  *
21  * 
22  *
23  * // should return {baseurl}/Pman/JsTemplate/mod/file
24  *
25  * 
26  *
27  *
28  */
29 require_once 'Pman.php';
30
31 class Pman_Core_JsTemplate extends Pman {
32     
33     
34     var $modDir = false;
35     
36     function getAuth()
37     {
38         parent::getAuth();
39         return true;
40          
41     }
42      
43     function get()
44     {
45         // get the modules.
46         header('Content-type: text/javascript');
47         
48         $ff = HTML_FlexyFramework::get();
49         
50         $pr = $ff->project;
51         $ar = explode(PATH_SEPARATOR, $ff->HTML_Template_Flexy['templateDir']);
52         
53         $prefix = $pr == 'Pman' ? 'Pman.' : '';
54         
55         foreach($ar as $mod) {
56             $dir =   dirname($mod) . '/jtemplates';
57             if (!file_exists($dir)) {
58                 echo '// missing directory '. htmlspecialchars($dir) ."\n";
59                 continue;
60             }
61             // got a directory..
62             $mn = basename(dirname($mod));
63             $ar = glob("$dir/*.html") ;
64             if (empty($ar)) {
65                 echo '// no template is directory '. htmlspecialchars($dir) ."\n";
66                 continue;
67             }
68             
69             echo "{$prefix}{$mn} = {$prefix}{$mn} || {};\n";
70             echo "{$prefix}{$mn}.template = {$prefix}{$mn}.template   || {};\n\n";
71             
72             foreach(glob("$dir/*.html") as $fn) {
73                 $name = "{$prefix}{$mn}.template." . preg_replace('/\.html$/i', '', basename($fn));
74                 echo $this->compile($fn, $name) . "\n";
75                 
76
77             }
78   //              testing..
79 //new HTML_FlexyFramework_JsTemplate('/home/alan/gitlive/web.mtrack/MTrackWeb/jtemplates/TimelineTicket.html', 'Pman.template.TimelineTicket');
80             
81             
82             
83         }
84         exit;
85         
86         
87         
88     }
89     
90     
91     function compile($fn, $name)
92     {
93         // cached? - check file see if we have cached contents.
94         
95         
96         $contents = file_get_contents($fn);
97         $ar = preg_split('/(\{[^\}]+})/', $contents, -1, PREG_SPLIT_DELIM_CAPTURE);
98         
99         
100         
101         
102         //echo '<PRE>' . htmlspecialchars(print_r($ar,true));
103         
104         $out= array();
105         
106         $head = "$name = function(t) {\n    var ret=[];\n";
107         
108         $funcs = array();
109         // do not allow nested functions..?
110         $fstart = -1;
111         $indent = 1;
112         
113         $ret = &$out;
114         foreach($ar as $item) {
115             $in = str_repeat("    ", $indent);
116             
117             //var_Dump(substr($item,-3,2));
118             switch(true) {
119                 case (!strlen($item)):
120                     continue;
121                 
122                 if ($inscript && ($item != '{end:}')) {
123                     $ret[] = $item;
124                 }
125                 if ($inscript && ($item == '{end:}')) {
126                     $inscript = false;
127                     
128                 }
129                 case ($item[0] != '{'):
130                     if (!strlen(trim($item))) {
131                         continue;
132                     }
133                     $ret[] = $in . "ret += ". json_encode($item) . ";";
134                     continue;
135                 
136                 
137                 case (substr($item,1,6) == 'script:'): 
138                     $inscript = true;
139                     continue;
140                 
141                 
142                 
143                 case (substr($item,1,3) == 'if('):
144                     $ret[] = $in . substr($item,1,-1) . ' {';
145                     $indent++;
146                     continue;
147                 
148                 case (substr($item,1,4) == 'end:'):
149                     $indent--;
150                     $in = str_repeat("    ", $indent);
151                     $ret[] = $in . "}";
152                     if ($fstart == $indent) {
153                         $fstart = -1;
154                         $ret = &$out;
155                     }
156                     continue;
157                 
158                 case (substr($item,1,7) == 'return:'):
159                     $ret[] = $in . "return;";
160                     continue;
161                 
162                 case (substr($item,1,9) == 'function:'):
163                     $fstart = $indent;
164                     $indent++;
165                     $ret = &$funcs;
166                     $def  = substr($item,10,-1) ;
167                     list($name,$body) = explode('(', $def, 2);
168                     
169                     
170                     $ret[] = $in . "var $name = function (" .  $body  . '{';
171                     continue;
172                 
173                 default:
174                     if (substr($item,-3,2) == ':h') {
175                         $ret[] = $in . "ret += ".  substr($item,1,-3) . ';';
176                         continue;
177                     }
178                     $ret[] = $in . "ret += Roo.util.Format.htmlEncode(".  substr($item,1,-1).');';
179                     continue;
180                 
181             }
182             
183             
184         }
185         $in = str_repeat("    ", $indent);
186         $ret[] = $in .  "return ret.join('');\n}\n";
187         return $head . implode("\n",$funcs) . "\n" .implode("\n",$out) ;
188         //echo '<PRE>' . htmlspecialchars(implode("\n",$ret));
189         
190         
191         
192     }
193     
194     
195     
196 }
197
198 // 
199