App-Mowyw
view release on metacpan or search on metacpan
lib/App/Mowyw.pm view on Meta::CPAN
if (defined $options{escape} && lc $options{escape} eq 'html'){
return encode_entities($c);
}
return $c if defined $c;
return '';
}
sub p_syntaxfile {
my $tokens = shift;
my $meta = shift;
my $tag_content = shift @$tokens;
$tag_content = strip_ws($tag_content->[1]);
p_expect($tokens, "TAG_END", $meta);
my @t = split m/\s+/, $tag_content;
if (scalar @t != 2){
parse_error(
"Usage of syntaxfile tag: [[[syntaxfile <filename> <language>",
$meta->{FILES},
$tokens->[0],
);
}
}
sub p_syntax {
my $tokens = shift;
my $meta = shift;
my $lang = shift @$tokens;
$lang = strip_ws($lang->[1]);
p_expect($tokens, "TAG_END", $meta);
my $str = "";
while ($tokens->[0] and not ($tokens->[0]->[0] eq "TAG_START" and $tokens->[1]->[1] eq "endsyntax" and $tokens->[2]->[0] eq "TAG_END")){
$str .= $tokens->[0]->[1];
shift @$tokens;
}
p_expect($tokens, "TAG_START", $meta);
p_expect($tokens, "KEYWORD", $meta);
p_expect($tokens, "TAG_END", $meta);
return do_hilight($str, $lang, $meta);
}
sub do_hilight {
my ($str, $lang, $meta) = @_;
if ($lang eq 'escape'){
return encode_entities($str);
}
eval {
no warnings "all";
require Text::VimColor;
};
if ($@){
# require was not successfull
print STDERR " Not syntax hilighting, Text::VimColor not found\n" unless $config{quiet};
# encode at least some special chars "by hand"
return encode_entities($str);
} else {
print STDERR "." unless $config{quiet};
# any encoding will do if vim automatically detects it
my $vim_encoding = 'utf-8';
my $BOM = "\x{feff}";
my $syn = Text::VimColor->new(
filetype => $lang,
string => encode($vim_encoding, $BOM . $str),
);
$str = decode($vim_encoding, $syn->html);
$str =~ s/^$BOM//;
return $str;
}
}
# parse sub: expect a specific token, return its content or die if the
# expectation was not met.
sub p_expect {
my ($tokens, $expect, $meta) = splice @_, 0, 3;
parse_error("Unexpected End of File, expected $expect", $meta->{FILES}) unless (@$tokens);
confess("\$tokens not a array ref - this is most likely a programming error\n$internal_error_message") unless(ref($tokens) eq "ARRAY");
if ($tokens->[0]->[0] eq $expect){
my $e_val = shift;
if (not defined($e_val) or $e_val eq $tokens->[0]->[1]){
my $val = $tokens->[0]->[1];
shift @$tokens;
return $val;
} else {
parse_error("Expected '$e_val', got $tokens->[0][1]\n",
$meta->{FILES}, $tokens->[0]);
}
}
parse_error(
"Expected token $expect, got $tokens->[0]->[0]\n",
$meta->{FILES},
$tokens->[0],
);
}
sub lex_string {
my $text = shift;
my @tokens = lex($text, \@input_tokens);
# print Data::Dumper->Dump(\@tokens);
return @tokens;
}
sub parse_tokens {
my $tokens = shift;
my $meta = shift;
my $str = "";
if ($meta->{INSIDE_ITEM}){
$str .= p_text($tokens);
} else {
$str .= p_text($tokens, {BRACES_START => 1, BRACES_END => 1});
}
while(@$tokens
and $tokens->[0]->[0] ne "TAG_END"
and $tokens->[0]->[0] ne "BRACES_END"){
# print scalar @$tokens;
# print " tokens left\n";
# warn $str;
if ($tokens->[0]->[0] eq "TAG_START"){
my $start = p_expect($tokens, "TAG_START", $meta);
my $key = p_expect($tokens, 'KEYWORD', $meta);
# warn "Found keyword $key\n";
my $error_sub = sub {
my ($tag, $prior_tag) = @_;
return sub {
my ($tokens, $meta) = @_;
( run in 0.980 second using v1.01-cache-2.11-cpan-140bd7fdf52 )