<?php
$source = <<<SOURCEND
This is a test
{% block hello %}
This is a test
This is a {{ \$test }}
{% end block %}
{{ block('hello') }}
{% for \$post in \$posts %}
{% 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('.$fragments[2].' as '.$fragments[0].'):'; break;
case 'for':
$stack[] = 'foreach';
return 'foreach('.$fragments[2].' as '.$fragments[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('<?=','?>'),$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);
This is a test
<?php function block_hello(){?>
This is a test
This is a <?= $test ?>
<?php }?>
<?= block('hello') ?>
<?php foreach($posts as $post):?>
<?php endforeach;?>