Graph-Reader-TGF

 view release on metacpan or  search on metacpan

TGF.pm  view on Meta::CPAN

package Graph::Reader::TGF;

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

use Encode qw(decode_utf8);
use Error::Pure qw(err);

our $VERSION = 0.04;

# Edge callback.
sub _edge_callback {
	my ($self, $graph, $id1, $id2, $edge_label) = @_;
	$graph->set_edge_attribute($id1, $id2, 'label', $edge_label);
	return;
}

# Init.
sub _init {
	my ($self, $param_hr) = @_;
	$self->SUPER::_init();
	if (exists $param_hr->{'edge_callback'}
		&& defined $param_hr->{'edge_callback'}
		&& ref $param_hr->{'edge_callback'} ne 'CODE') {

		err "Parameter 'edge_callback' isn't reference to code.";
	}
	$self->{'edge_callback'} = $param_hr->{'edge_callback'};
	if (exists $param_hr->{'vertex_callback'}
		&& defined $param_hr->{'vertex_callback'}
		&& ref $param_hr->{'vertex_callback'} ne 'CODE') {

		err "Parameter 'vertex_callback' isn't reference to code.";
	}
	$self->{'vertex_callback'} = $param_hr->{'vertex_callback'};
	return;
}

# Read graph subroutine.
sub _read_graph {
	my ($self, $graph, $fh) = @_;
	my $vertexes = 1;
	while (my $line = decode_utf8(<$fh>)) {
		chomp $line;

		# End of vertexes section.
		if ($line =~ m/^#/ms) {
			$vertexes = 0;
			next;
		}

		# Vertexes.
		if ($vertexes) {
			my ($id, $vertex_label) = split m/\s+/ms, $line, 2;
			if (! defined $vertex_label) {
				$vertex_label = $id;
			}
			$graph->add_vertex($id);
			if ($self->{'vertex_callback'}) {
				$self->{'vertex_callback'}->($self, $graph,
					$id, $vertex_label);
			} else {
				$self->_vertex_callback($graph, $id,
					$vertex_label);
			}

		# Edges.
		} else {
			my ($id1, $id2, $edge_label) = split m/\s+/ms, $line, 3;
			$graph->add_edge($id1, $id2);
			if ($self->{'edge_callback'}) {
				$self->{'edge_callback'}->($self, $graph, $id1,
					$id2, $edge_label);
			} else {
				$self->_edge_callback($graph, $id1, $id2,
					$edge_label);
			}
		}
		
	}
	return;
}

# Vertex callback.
sub _vertex_callback {
	my ($self, $graph, $id, $vertex_label) = @_;
	$graph->set_vertex_attribute($id, 'label', $vertex_label);
	return;
}

1;

__END__

=pod

=encoding utf8

=head1 NAME

Graph::Reader::TGF - Perl class for reading a graph from TGF format.

=head1 SYNOPSIS

 use Graph::Reader::TGF;

 my $obj = Graph::Reader::TGF->new;
 my $graph = $obj->read_graph($tgf_file);

=head1 METHODS

=head2 C<new>

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

Constructor.

This doesn't take any arguments.

Returns Graph::Reader::TGF object.

=head2 C<read_graph>

 my $graph = $obj->read_graph($tgf_file);

Read a graph from the specified file.
The argument can either be a filename, or a filehandle for a previously opened file.

Returns Graph object.



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