lib/rgl/graphxml.rb
# graphxml.rb
#
# This file contains minimal support for creating RGL graphs from the GraphML
# format (see https://graphml.graphdrawing.org/). The main purpose is to
# have a rich set of example graphs to have some more tests.
#
# See the examples directory, which contains a subdirectory _north_ with the
# Graph catalog GraphViz (see
# https://www.research.att.com/sw/tools/graphviz/refs.html).
#
# We use REXML::StreamListener from the REXML library
# (https://www.germane-software.com/software/rexml) to parse the grapml files.
require 'rgl/mutable'
require 'rexml/document'
require 'rexml/streamlistener'
module RGL
module MutableGraph
# Used to parse a subset of GraphML into an RGL graph implementation.
#
class MutableGraphParser
include REXML::StreamListener
# First resets +graph+ to be empty and stores a reference for use with
# #tag_start.
#
def initialize(graph)
@graph = graph
@graph.remove_vertices(@graph.vertices)
end
# Processes incoming edge and node elements from GraphML in order to
# populate the graph given to #new.
#
def tag_start(name, attrs)
case name
when 'edge'
@graph.add_edge(attrs['source'], attrs['target'])
when 'node'
@graph.add_vertex(attrs['id'])
end
end
end # class MutableGraphParser
# Initializes an RGL graph from a subset of the GraphML format given in
# +source+ (see https://graphml.graphdrawing.org/).
#
def from_graphxml(source)
listener = MutableGraphParser.new(self)
REXML::Document.parse_stream(source, listener)
self
end
end # module MutableGraph
end # module RGL