lib/graphviz/graphml.rb in ruby-graphviz-1.0.7 vs lib/graphviz/graphml.rb in ruby-graphviz-1.0.8
- old
+ new
@@ -1,18 +1,18 @@
#!/usr/bin/env ruby
# Copyright (C) 2010 Gregoire Lejeune <gregoire.lejeune@free.fr>
-#
+#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
-#
+#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
require 'graphviz'
@@ -26,33 +26,33 @@
attr_reader :attributes
def attributs
warn "`GraphViz::GraphML#attributs` is deprecated, please, use `GraphViz::GraphML#attributes`"
return @attributes
end
-
+
# The GraphViz object
attr_accessor :graph
-
+
DEST = {
'node' => [:nodes],
'edge' => [:edges],
'graph' => [:graphs],
'graphml' => [:graphml],
'hyperedge' => [:hyperedge],
'port' => [:port],
'endpoint' => [:endpoint],
'all' => [:nodes, :edges, :graphs, :graphml, :hyperedge, :port, :endpoint]
}
-
+
GTYPE = {
'directed' => :digraph,
'undirected' => :graph
}
-
+
# Create a new GraphViz object from a GraphML file of string
def initialize( file_or_str )
- data = ((File.file?( file_or_str )) ? File::new(file_or_str) : file_or_str)
+ data = ((File.file?( file_or_str )) ? File::new(file_or_str) : file_or_str)
@xmlDoc = REXML::Document::new( data )
@attributes = {
:nodes => {},
:edges => {},
:graphs => {},
@@ -65,73 +65,73 @@
@graph = nil
@current_attr = nil
@current_node = nil
@current_edge = nil
@current_graph = nil
-
+
parse( @xmlDoc.root )
end
-
+
def parse( node ) #:nodoc:
send( node.name.to_sym, node )
end
-
+
def graphml( node ) #:nodoc:
node.each_element( ) do |child|
begin
send( "graphml_#{child.name}".to_sym, child )
rescue NoMethodError => e
raise GraphMLError, "node #{child.name} can be child of graphml"
end
end
end
- def graphml_data(node)
+ def graphml_data(node)
warn "graphml/data not supported!"
end
-
+
def graphml_key( node ) #:nodoc:
id = node.attributes['id']
@current_attr = {
:name => node.attributes['attr.name'],
:type => node.attributes['attr.type']
- }
+ }
if @current_attr[:name].nil?
@ignored_keys << id
else
DEST[node.attributes['for']].each do |d|
@attributes[d][id] = @current_attr
end
-
+
node.each_element( ) do |child|
begin
send( "graphml_key_#{child.name}".to_sym, child )
rescue NoMethodError => e
raise GraphMLError, "node #{child.name} can be child of key"
end
end
end
-
+
@current_attr = nil
end
-
+
def graphml_key_default( node ) #:nodoc:
@current_attr[:default] = node.texts().join('\n')
end
-
+
def graphml_graph( node ) #:nodoc:
@current_node = nil
-
+
if @current_graph.nil?
@graph = GraphViz.new( node.attributes['id'], :type => GTYPE[node.attributes['edgedefault']] )
@current_graph = @graph
previous_graph = @graph
else
- previous_graph = @current_graph
+ previous_graph = @current_graph
@current_graph = previous_graph.add_graph( node.attributes['id'] )
end
-
+
@attributes[:graphs].each do |id, data|
begin
@current_graph.graph[data[:name]] = data[:default] if data.has_key?(:default)
rescue ArgumentError => e
warn e
@@ -149,29 +149,29 @@
@current_graph.edge[data[:name]] = data[:default] if data.has_key?(:default)
rescue ArgumentError => e
warn e
end
end
-
+
node.each_element( ) do |child|
send( "graphml_graph_#{child.name}".to_sym, child )
end
-
+
@current_graph = previous_graph
end
-
+
def graphml_graph_data( node ) #:nodoc:
begin
@current_graph[@attributes[:graphs][node.attributes['key']][:name]] = node.texts().join('\n')
rescue ArgumentError => e
warn e
end
end
-
+
def graphml_graph_node( node ) #:nodoc:
@current_node = {}
-
+
node.each_element( ) do |child|
case child.name
when "graph"
graphml_graph( child )
else
@@ -180,89 +180,89 @@
rescue NoMethodError => e
raise GraphMLError, "node #{child.name} can be child of node"
end
end
end
-
+
unless @current_node.nil?
node = @current_graph.add_nodes( node.attributes['id'] )
@current_node.each do |k, v|
begin
node[k] = v
rescue ArgumentError => e
warn e
end
end
end
-
+
@current_node = nil
end
-
+
def graphml_graph_node_data( node ) #:nodoc:
return if @ignored_keys.include?(node.attributes['key'])
begin
@current_node[@attributes[:nodes][node.attributes['key']][:name]] = node.texts().join('\n')
rescue ArgumentError => e
warn e
end
end
-
+
def graphml_graph_node_port( node ) #:nodoc:
@current_node[:shape] = :record
port = node.attributes['name']
if @current_node[:label]
label = @current_node[:label].gsub( "{", "" ).gsub( "}", "" )
@current_node[:label] = "#{label}|<#{port}> #{port}"
else
@current_node[:label] = "<#{port}> #{port}"
end
end
-
+
def graphml_graph_edge( node ) #:nodoc:
source = node.attributes['source']
source = {source => node.attributes['sourceport']} if node.attributes['sourceport']
target = node.attributes['target']
target = {target => node.attributes['targetport']} if node.attributes['targetport']
-
+
@current_edge = @current_graph.add_edges( source, target )
-
+
node.each_element( ) do |child|
begin
send( "graphml_graph_edge_#{child.name}".to_sym, child )
rescue NoMethodError => e
raise GraphMLError, "node #{child.name} can be child of edge"
end
end
-
+
@current_edge = nil
end
-
+
def graphml_graph_edge_data( node ) #:nodoc:
return if @ignored_keys.include?(node.attributes['key'])
begin
@current_edge[@attributes[:edges][node.attributes['key']][:name]] = node.texts().join('\n')
rescue ArgumentError => e
warn e
end
end
-
+
def graphml_graph_hyperedge( node ) #:nodoc:
list = []
-
+
node.each_element( ) do |child|
if child.name == "endpoint"
if child.attributes['port']
list << { child.attributes['node'] => child.attributes['port'] }
else
list << child.attributes['node']
end
end
end
-
+
list.each { |s|
list.each { |t|
@current_graph.add_edges( s, t ) unless s == t
}
- }
+ }
end
end
end