Graph-Reader-UnicodeTree

 view release on metacpan or  search on metacpan

UnicodeTree.pm  view on Meta::CPAN

package Graph::Reader::UnicodeTree;

use base qw(Graph::Reader);
use strict;
use warnings;

use Encode qw(decode_utf8);
use Readonly;

# Constants.
Readonly::Scalar our $GR_LINE => decode_utf8(q{───});
Readonly::Scalar our $GR_TREE => decode_utf8(q{─┬─});

our $VERSION = 0.03;

# Read graph subroutine.
sub _read_graph {
	my ($self, $graph, $fh) = @_;
	my @indent = ([0, undef]);
	while (my $line = decode_utf8(<$fh>)) {
		chomp $line;

		# Remove indent.
		my $parseable_line = substr $line, $indent[-1]->[0];

		# Split to vertexes.
		my @new_indent;
		my @vertexes;
		my $new_indent = $indent[-1]->[0];
		my $last_indent;
		foreach my $new_block (split m/$GR_TREE/ms, $parseable_line) {
			if (defined $last_indent) {
				push @new_indent, $last_indent;
				$last_indent = undef;
			}
			my $last_vertex;	
			foreach my $new_vertex (split m/$GR_LINE/ms, $new_block) {
				push @vertexes, $new_vertex;
				$last_vertex = $new_vertex;
			}
			$new_indent += (length $new_block) + 3;
			$last_indent = [$new_indent, $last_vertex];
		}

		# Add vertexes and edges.
		my $first_v;
		if (defined $indent[-1]->[1]) {
			$first_v = $indent[-1]->[1];
		} else {
			$first_v = shift @vertexes;
		}
		$graph->add_vertex($first_v);
		foreach my $second_v (@vertexes) {
			$graph->add_vertex($second_v);
			$graph->add_edge($first_v, $second_v);
			$first_v = $second_v;
		}

		# Update indent.
		my $end_pos = $indent[-1]->[0] - 2;
		if ($end_pos > 0) {
			my $end_char = substr $line, $end_pos, 1;
			if ($end_char eq decode_utf8('â””')) {
				pop @indent;
			}
		}
		if (@new_indent) {
			push @indent, @new_indent;
		}
	}
	return;
}

1;

__END__

=pod

=encoding utf8

=head1 NAME

Graph::Reader::UnicodeTree - Perl class for reading a graph from unicode tree text format.

=head1 SYNOPSIS

 use Graph::Reader::UnicodeTree;

 my $obj = Graph::Reader::UnicodeTree->new;
 my $graph = $obj->read_graph($unicode_tree_file);

=head1 METHODS

=head2 C<new>

 my $obj = Graph::Reader::UnicodeTree->new;



( run in 0.454 second using v1.01-cache-2.11-cpan-71847e10f99 )