Graph::Writer::TGXML - write out directed graph as TouchGraph LinkBrowser XML


Graph-Writer-TGXML documentation Contained in the Graph-Writer-TGXML distribution.

Index


Code Index:

NAME

Top

Graph::Writer::TGXML - write out directed graph as TouchGraph LinkBrowser XML

SYNOPSIS

Top

    use Graph;
    use Graph::Writer::TGXML;

    $graph = Graph->new();
    # add edges and nodes to the graph

    $writer = Graph::Writer::TGXML->new();
    $writer->write_graph($graph, 'mygraph.xml');

DESCRIPTION

Top

Graph::Writer::TGXML is a class for writing out a directed graph in a format suitable for use with TouchGraph's LinkBrowser. The graph must be an instance of the Graph class, which is actually a set of classes developed by Jarkko Hietaniemi.

The XML format contains Nodes and Edges. For nodes, the label, URL and tooltip attributes are used, for label, url and hint respectively. For edges, no attributes are currently used.

METHODS

Top

new()

Constructor - generate a new writer instance.

    $writer = Graph::Writer::TGXML->new();

This doesn't take any arguments.

write_graph()

Write a specific graph to a named file:

    $writer->write_graph($graph, $file);

The $file argument can either be a filename, or a filehandle for a previously opened file.

KNOWN BUGS

Top

TODO

Top

Allow users to supply colours, node locations, hint box sizes, and edge lengths.

SEE ALSO

Top

XML::Writer

The perl module used to actually write out the XML. It handles entities etc.

Graph

Jarkko Hietaniemi's modules for representing directed graphs, available from CPAN under modules/by-module/Graph/

Algorithms in Perl

The O'Reilly book which has a chapter on directed graphs, which is based around Jarkko's modules.

Graph::Writer

The base-class for Graph::Writer::XML

TouchGraph

A java software to navigate through directed graphs. http://www.touchgraph.com

AUTHOR

Top

Jess Robinson <jrobinson@desert-island.demon.co.uk>

COPYRIGHT

Top


Graph-Writer-TGXML documentation Contained in the Graph-Writer-TGXML distribution.

#
# Graph::Writer::TGXML - write a directed graph out as TouchGraph LinkBrowser XML
#
# $Id$
#
package Graph::Writer::TGXML;

use strict;
use warnings;

use Graph::Writer;
use XML::Writer;

use vars qw(@ISA $VERSION);
$VERSION = 0.01;
@ISA = qw(Graph::Writer);


#=======================================================================
#
# _write_graph() - perform the writing of the graph
#
# This is invoked from the public write_graph() method,
# and is where the actual writing of the graph happens.
#
# Basically we start a graph element then:
#	[] dump out any attributes of the graph
#	[] dump out all vertices, with any attributes of each vertex
#	[] dump out all edges, with any attributes of each edge
# And then close the graph element. Ta da!
#
#=======================================================================
sub _write_graph
{
    my $self  = shift;
    my $graph = shift;
    my $FILE  = shift;

    my $v;
    my $from;
    my $to;
#    my %attributes;
    my $xmlwriter;


    $xmlwriter = XML::Writer->new(OUTPUT      => $FILE,
                                  DATA_MODE   => 1,
                                  DATA_INDENT => 2);
    $xmlwriter->setOutput($FILE);

    $xmlwriter->startTag('TOUCHGRAPH_LB', version => '1.20');

    $xmlwriter->startTag('NODESET');

    #-------------------------------------------------------------------
    # dump out vertices of the graph, including any attributes
    #-------------------------------------------------------------------
    foreach $v ($graph->vertices)
    {
        my $attributes = $graph->get_vertex_attributes($v) || {};

#        print ">$v<\n";

        $xmlwriter->startTag('NODE', 'nodeID' => $v);
        $xmlwriter->emptyTag('NODE_LOCATION', 
                             x => 633,
                             y => 30,
                             visible => 'true' );
        $xmlwriter->emptyTag('NODE_LABEL',
                             label => $attributes->{label} || $v,
                             shape => 2,
                             backColor => 'FFFFFF',
                             textColor => '000000',
                             fontSize => 16 );

        $xmlwriter->emptyTag('NODE_URL',
                             url => $attributes->{URL} || '',
                             urlIsLocal  => 'false',
                             urlIsXML =>'false' );

        $attributes->{tooltip} ||= '';
        $attributes->{tooltip} =~ s/\\74/</g;
        $attributes->{tooltip} =~ s/\\76/>/g;
        $xmlwriter->emptyTag('NODE_HINT',
                             hint => $attributes->{tooltip} || '',
                             width => 400,
                             height => -1,
                             isHTML => 'false' );
        $xmlwriter->endTag('NODE');
    }

    $xmlwriter->endTag('NODESET');

    #-------------------------------------------------------------------
    # dump out edges of the graph, including any attributes
    #-------------------------------------------------------------------

    $xmlwriter->startTag('EDGESET');

    my @edges = $graph->edges;
    while (@edges)
    {
        ($from, $to) = splice(@edges, 0, 2);
#        my $attributes = $graph->get_edge_attributes($from, $to);

        $xmlwriter->emptyTag('EDGE',
                             fromID => $from,
                             toID => $to,
                             type => 1,
                             length => 40,
                             visible => 'true',
                             color => 'A0A0A0' );

    }

    $xmlwriter->endTag('EDGESET');

    $xmlwriter->endTag('TOUCHGRAPH_LB');
    $xmlwriter->end();

    return 1;
}

1;

__END__