#!/usr/bin/env perl
use 5.010;
use strict;
use warnings;
use FindBin;
use Syntax::SourceHighlight;
my $hl = Syntax::SourceHighlight::SourceHighlight->new('esc.outlang');
my ($isfile, $in) = do {
if (not @ARGV or $ARGV[0] eq '-f') {
(1, $ARGV[1] // $FindBin::Script);
}
elsif ($ARGV[0] eq '-s') {
die "No source specified" unless (defined $ARGV[1]);
(0, $ARGV[1]);
}
else {
die "First parameter should be -f for file input or -s for string input";
}
};
my $lang = eval {
my $lm = Syntax::SourceHighlight::LangMap->new();
if ($ARGV[2]) {
$lm->getMappedFileName($ARGV[2]);
}
elsif ($isfile) {
$lm->getMappedFileNameFromFileName($in);
}
else {
die "Language cannot be guessed";
}
};
unless ($lang) {
warn "Problems determining source language, assuming Perl: $@";
$lang = 'perl.lang';
}
my $nvars = 0;
my $cvars = 0;
$hl->setHighlightEventListener(sub {
my ($evt) = @_;
if ($evt->type == $Syntax::SourceHighlight::HighlightEvent::FORMAT and
$evt->token->matched->[0] =~ m/^variable:/) {
$nvars++;
$cvars += $evt->token->matchedSize
}
});
if ($isfile) {
$hl->highlightFile($in, '', $lang);
}
else {
say $hl->highlightString($in, $lang);
}
say "The program contained $nvars variable references occupying $cvars source characters.";