Acme-TextLayout
view release on metacpan or search on metacpan
lib/Acme/TextLayout.pm view on Meta::CPAN
=head2 B<instantiate>
$tl->instantiate(text => ??);
-or-
$tl->instantiate(file => ??);
Specify the textual layout pattern we are interested in, either
from a text string or a file.
Returns undef if something wrong with your input.
=cut
sub instantiate {
my ($self, %opts) = @_;
my $file = $opts{file};
my $text = $opts{text};
# reset state on new instantiation
$.textRef = [];
$.Ranges = {};
$.widest = undef;
$.chars = {};
$.Above = $.Below = $.Left = $.Right = undef;
if (defined $file) {
my $fh = FileHandle->new($file);
return unless defined $fh;
my @text = <$fh>;
$fh->close;
chomp foreach @text;
s/^\s+// foreach @text;
$text = [ @text ];
./_widest(\@text);
}
elsif (defined $text) {
my @text = split(/\n{1}/, $text);
s/^\s+// foreach @text;
$text = [ @text ];
./_widest(\@text);
}
else {
return undef;
}
./_whats_in_there($text);
./_widest($text);
$.textRef = $text;
map {
return undef unless length($_) == $.widest;
} @{$.textRef};
my %Ranges;
my %chars = %.chars;
map {
my $C = $_;
my @d = ./range($C);
$Ranges{$C} = \@d;
} keys(%chars);
$.Ranges = \%Ranges;
print STDERR "Pattern appears disjoint\n" if ./_disjoint();
return undef if ./_disjoint();
# signify OK if we got here
return 1;
}
# not a complete test, but tests for the obvious
sub _disjoint {
my ($self) = @_;
my @text = @{$.textRef};
my @chars = ./characters();
my $ok = 1;
( run in 1.860 second using v1.01-cache-2.11-cpan-d80b1682f3f )