Sha256: 6c70816d3b0a063316bf4371339fc5c23f967df6c9ffa459b029b627fe138364

Contents?: true

Size: 1.19 KB

Versions: 1

Compression:

Stored size: 1.19 KB

Contents

require 'nokogiri'

module Tests
  class NamesAccessor
    def initialize(graph)
      @graph = graph
    end
    def containers
      names @graph.container_nodes
    end
    def things
      names @graph.thing_nodes
    end
    def edges
      names @graph.edge_nodes
    end

    private
    attr_reader :graph

    def names(nodes)
      nodes.map { |g|
        g.css('text').text
      }
    end
  end

  class SvgGraph
    def self.parse_file(svg_filename)
      SvgGraph.new File.read(svg_filename)
    end

    def initialize(svg)
      @doc = Nokogiri::XML(svg) {|config| config.noblanks }
    end

    def title
      title_prefix = '<!-- Title: '
      title_end = ' Pages: '
      title_node_text = comments.find { |c|
        c.to_s.start_with? title_prefix
      }.to_s
      title_node_text.gsub(title_prefix, '').split(title_end).first
    end

    def container_nodes
      @doc.css 'g.cluster'
    end

    def thing_nodes
      @doc.css 'g.node'
    end

    def edge_nodes
      @doc.css 'g.edge'
    end

    def names_of
      NamesAccessor.new self
    end

    def to_s
      @doc.to_xml indent: 2
    end

    private

    def comments
      @doc.children.select(&:comment?)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dogviz-0.0.22 tests/svg_graph.rb