Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Tree: afc70cdc81
Fetching contributors…

Cannot retrieve contributors at this time

67 lines (60 sloc) 1.88 kB
class Ratel {
has $.source;
has $.compiled;
has @!hunks;
has %.transforms is rw;
method new (*%args) {
my $self = self.bless(*, |%args);
$self.initialize;
return $self;
}
method initialize {
# XXX Needs to be re-thought to allow wrapping the contents
# of the unquote, use parameterized delims, etc...
%!transforms{'='} = -> $a {"print $a"};
%!transforms{'!'} = -> $a {'print %attrs<' ~ $a ~ '>'};
self.source($.source) if defined $.source;
}
multi method load(Str $filename) {
self.source(slurp($filename));
}
multi method source() {
return $!source;
}
multi method source(Str $text) {
my $index = 0;
$!source = $text;
my $source = '%]' ~ $text ~ '[%';
for %!transforms.kv -> $k, $v {
$source.=subst(rule {'[%'$k ([<!before '%]'>.]*) '%]'}, -> $match {'[%' ~ $v($match[0]) ~ '%]'}, :g);
}
@!hunks = $source.comb(rule {'%]' ([<!before '[%'>.]*) '[%'});
@!hunks>>.=subst(/^'%]' ([<!before '[%'>.]*) '[%'$/, -> $m { $m[0] }, :g);
$!compiled
= $source.subst(/('%]' [<!before '[%'>.]* '[%')/,
{";\$.emit-hunk({$index++});"},
:g);
return;
}
method emit-hunk(Int $i) {
$.emit(@!hunks[$i][0]);
}
method emit($m) {
$*result ~= $m;
}
method render(*%attrs) {
my $*result = '';
my $obj = self;
# XXX Needs cleanup...
my $*OUT = (class {
method say(*@args) {
$obj.emit($_) for (@args, "\n");
}
method print(*@args) {
$obj.emit($_) for @args;
}
}).new();;
eval $!compiled;
return $*result;
}
}
Jump to Line
Something went wrong with that request. Please try again.