use v6-alpha; module WTemplate-0.0.1; ## set up the globals my %WIDGETS; ## set up the rules rule sp { <[ ]> } rule id { <[a..z]><[a..z0..9]>+ } rule elem { \< server \: () [+ () *= *"(<-["]>*)"]* * \> (.*?) \<\/ server \: $0 \> } rule block { \< server \: () [+ () *= *"(<-["]>*)"]* * \/\> } ## the main subs sub run_widget($match_in, %variables) { my $match = $match_in ?? $match_in !! $match_in; my $widget = $match[0]; my %parameters; %parameters{'_content'} = $match[3] if $match[3]; if defined $match[1] and $match[1] ne '' { for 0..$match[1].elems-1 { %parameters{$match[1][$_]} = $match[2][$_]; } } return %WIDGETS{$widget}(%parameters, %variables); } sub fill_with($template: %variables?) is export { my $return = $template; $return ~~ s:g! | !{ run_widget($/, %variables) }!; return $return; } ## some basic widgets sub new_widget($name, &sub) is export { %WIDGETS{$name} = ⊂ } new_widget 'text', sub (%p, %v) { return %v{%p{'id'}}; }; new_widget 'input', sub (%p, %v) { return ''; }; new_widget 'hidden', sub(%p, %v) { return ''; }; new_widget 'textarea', sub(%p, %v) { return ''; }; new_widget 'repeater', sub(%p, %v) { my $return; for %v{%p{'id'}} { $return ~= %p{'_content'}.fill_with(%$_); } return $return; };