App-Mowyw
view release on metacpan or search on metacpan
lib/App/Mowyw.pm view on Meta::CPAN
# command
# the second (optional) arg contains a hash of additional tokens that are
# treated as plain text
sub p_text {
my $tokens = shift;
my %a;
%a = %{$_[0]} if ($_[0]);
my $str = "";
my %allowed_tokens = (
KEYWORD => 1,
UNMATCHED => 1,
);
while ( $tokens
and $tokens->[0]
and $tokens->[0]->[0]
and ($allowed_tokens{$tokens->[0]->[0]}
or $a{$tokens->[0]->[0]})){
$str .= $tokens->[0]->[1];
shift @$tokens;
}
return $str;
}
# parse sub: parse an include statement.
# note that TAG_START and the keyword "include" are already stripped
sub p_include {
my $tokens = shift;
my $meta = shift;
# normally we'd expect an UNMATCHED token, but the user might choose
# a keyword as well as file name
my $fn = strip_ws(slurp_upto_token($tokens, 'TAG_END', $meta));
$fn = get_include_filename('include', $fn, $meta->{FILES}->[-1]);
# print Dumper $tokens;
my $m = my_dclone($meta);
unshift @{$m->{FILES}}, $fn;
return parse_file($fn, $m);
}
# parse sub: parse a system statement.
sub p_system {
my $tokens = shift;
my $meta = shift;
my $fn = strip_ws(slurp_upto_token($tokens, 'TAG_END', $meta));
print STDERR "Executing external command '$fn'\n" unless $config{quiet};
my $tmp = `$fn`;
return ($tmp);
}
# parse sub: parse a 'menu' statement.
# note that TAG_START and the keyword "menu" are already stripped
sub p_menu {
my $tokens = shift;
my $meta = shift;
# print Dumper $meta;
my $key = strip_ws(p_expect($tokens, "UNMATCHED", $meta));
my @words = split /\s+/, $key;
p_expect($tokens, "TAG_END", $meta);
my $menu_fn = shift @words;
# print "\nMenu: '$menu_fn'\n";
$menu_fn = get_include_filename('menu', $menu_fn, $meta->{FILES}->[-1]);
# print "Menu after frobbing: '$menu_fn'\n";
my $m = my_dclone($meta);
push @{$m->{ITEMS}}, @words;
unshift @{$m->{FILES}}, $menu_fn;
return parse_file($menu_fn, $m);
}
# parse sub: parse an 'option' statement
sub p_option {
my $tokens = shift;
my $meta = shift;
my $key = strip_ws(p_expect($tokens, "UNMATCHED", $meta));
my @words = split /\s+/, $key;
my $option_key = shift @words;
my $option_val = join " ", @words;
$meta->{OPTIONS}->{$option_key} = $option_val;
p_expect($tokens, "TAG_END", $meta);
return "";
}
#parse sub: parse an "item" statement
sub p_item {
my $tokens = shift;
my $meta = shift;
my $content = p_expect($tokens, "UNMATCHED", $meta);
$content =~ s/^\s+//;
$content =~ m/^(\S+)/;
my $key = $1;
$content =~ s/^\S+//;
my $m = my_dclone($meta);
# print Data::Dumper->Dump([$m]);
if ($meta->{ITEMS}->[0] and $meta->{ITEMS}->[0] eq $key){
shift @{$m->{ITEMS}};
$m->{CURRENT_ITEM} = $key;
} else {
$m->{ITEMS} = [];
$m->{CURRENT_ITEM} = undef;
}
$m->{INSIDE_ITEM} = 1;
my $str = $content . parse_tokens($tokens, $m);
p_expect($tokens, "TAG_END", $meta);
return $str;
}
sub p_bind {
my ($tokens, $meta) = @_;
my $contents = strip_ws(slurp_upto_token($tokens, 'TAG_END', $meta));
my ($var, $rest) = split m/\s+/, $contents, 2;
my $string = qr{(
'[^'\\]*(?>\\.[^'\\]*)*'
|"[^"\\]*(?>\\.[^"\\]*)*'
|[^"']\S*
)}x;
my %options = parse_hash($rest, 'bind', $meta);
if ($options{file}){
$options{file} = get_include_filename('include', $options{file}, $meta->{FILES}->[-1]);
( run in 2.091 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )