<?php
$source = <<<'SOURCEND'
This is a test
{% block hello %}
This is a test
This is a {{ $test }}
{% end block %}
{{ block('hello') }}
{% for $post => $pappa in $posts %}
{% if $post <= 0 %}
{{ $post==3 ? 'Yes' : 'No' }}
{% end %}
{% end %}
SOURCEND;
function microtwig_compile($source){
function microtwig_parsecmd($cmd){
static $stack = array();
$fragments = preg_split('/\s+/',$cmd);
$cmd = array_shift($fragments);
switch($cmd){
case 'block': return 'function block_'.$fragments[0].'(){'; break;
case 'if':
$stack[] = 'if';
return 'if('.implode(' ',$fragments).'):'; break;
case 'for':
$stack[] = 'foreach';
$tmp = explode(' in ',implode(' ',$fragments));
return 'foreach('.$tmp[1].' as '.$tmp[0].'):'; break;
case 'end':
switch(isset($fragments[0])?$fragments[0]:''){
case 'block': return '}'; break;
default:
switch($peek = array_pop($stack)){
case 'if': return 'endif;'; break;
case 'foreach': return 'endforeach;'; break;
}
break;
}
break;
default: break;
}
}
$cnt=0;
$fragments = array();
$source = str_replace(array('{{','}}'),array('<?php echo','?>'),$source);
foreach(explode('{%',$source) as $tmp) {
foreach(explode('%}',$tmp) as $item) {
$fragments[] = $cnt++%2?'<?php '.microtwig_parsecmd(trim($item)).'?>':$item;
}
}
return implode('',$fragments);
}
echo microtwig_compile($source);
preferences:
38.82 ms | 402 KiB | 5 Q