[前][次][番号順一覧][スレッド一覧]

ruby-changes:3269

From: ko1@a...
Date: 28 Dec 2007 16:11:53 +0900
Subject: [ruby-changes:3269] drbrain - Ruby:r14762 (trunk): Move lib/rdoc/dot/dot.rb to lib/rdoc, un-namespace.

drbrain	2007-12-28 16:11:30 +0900 (Fri, 28 Dec 2007)

  New Revision: 14762

  Added files:
    trunk/lib/rdoc/dot.rb
  Removed directories:
    trunk/lib/rdoc/dot/
  Modified files:
    trunk/ChangeLog
    trunk/lib/rdoc/diagram.rb

  Log:
    Move lib/rdoc/dot/dot.rb to lib/rdoc, un-namespace.
    
    Fix lib/rdoc/diagrom.rb for 1.9
  Deleted: trunk/lib/rdoc/dot/
    % svn ls -r 14762 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rdoc/dot/

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14762&r2=14761
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rdoc/dot.rb
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rdoc/diagram.rb?r1=14762&r2=14761

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 14761)
+++ ChangeLog	(revision 14762)
@@ -1,3 +1,9 @@
+Fri Dec 28 16:10:00 2007  Eric Hodel  <drbrain@s...>
+
+	* lib/rdoc/dot/dot.rb: Move to lib/rdoc/dot.rb. Fix namespacing.
+
+	* lib/rdoc/diagram.rb: Update for 1.9.
+
 Fri Dec 28 15:38:29 2007  Eric Hodel  <drbrain@s...>
 
 	* lib/rdoc/markup/sample/: Move to sample/rdoc/markup directory.
Index: lib/rdoc/diagram.rb
===================================================================
--- lib/rdoc/diagram.rb	(revision 14761)
+++ lib/rdoc/diagram.rb	(revision 14762)
@@ -4,7 +4,7 @@
 # You must have the V1.7 or later in your path
 # http://www.research.att.com/sw/tools/graphviz/
 
-require "rdoc/dot/dot"
+require "rdoc/dot"
 require 'rdoc/options'
 
 module RDoc
@@ -55,7 +55,7 @@
         @done_modules = {}
         @local_names = find_names(i)
         @global_names = []
-        @global_graph = graph = DOT::DOTDigraph.new('name' => 'TopLevel',
+        @global_graph = graph = DOT::Digraph.new('name' => 'TopLevel',
                                     'fontname' => FONT,
                                     'fontsize' => '8',
                                     'bgcolor'  => 'lightcyan1',
@@ -63,7 +63,7 @@
         
         # it's a little hack %) i'm too lazy to create a separate class
         # for default node
-        graph << DOT::DOTNode.new('name' => 'node',
+        graph << DOT::Node.new('name' => 'node',
                                   'fontname' => FONT,
                                   'color' => 'black',
                                   'fontsize' => 8)
@@ -82,13 +82,13 @@
           @local_names = find_names(mod)
           @global_names = []
 
-          @global_graph = graph = DOT::DOTDigraph.new('name' => 'TopLevel',
+          @global_graph = graph = DOT::Digraph.new('name' => 'TopLevel',
                                       'fontname' => FONT,
                                       'fontsize' => '8',
                                       'bgcolor'  => 'lightcyan1',
                                       'compound' => 'true')
 
-          graph << DOT::DOTNode.new('name' => 'node',
+          graph << DOT::Node.new('name' => 'node',
                                     'fontname' => FONT,
                                     'color' => 'black',
                                     'fontsize' => 8)
@@ -127,7 +127,7 @@
 
       @counter += 1
       url = mod.http_url("classes")
-      m = DOT::DOTSubgraph.new('name' => "cluster_#{mod.full_name.gsub( /:/,'_' )}",
+      m = DOT::Subgraph.new('name' => "cluster_#{mod.full_name.gsub( /:/,'_' )}",
                                'label' => mod.name,
                                'fontname' => FONT,
                                'color' => 'blue', 
@@ -143,7 +143,7 @@
         mod.includes.each do |inc|
           m_full_name = find_full_name(inc.name, mod)
           if @local_names.include?(m_full_name)
-            @global_graph << DOT::DOTEdge.new('from' => "#{m_full_name.gsub( /:/,'_' )}",
+            @global_graph << DOT::Edge.new('from' => "#{m_full_name.gsub( /:/,'_' )}",
                                       'to' => "#{mod.full_name.gsub( /:/,'_' )}",
                                       'ltail' => "cluster_#{m_full_name.gsub( /:/,'_' )}",
                                       'lhead' => "cluster_#{mod.full_name.gsub( /:/,'_' )}")
@@ -151,13 +151,13 @@
             unless @global_names.include?(m_full_name)
               path = m_full_name.split("::")
               url = File.join('classes', *path) + ".html"
-              @global_graph << DOT::DOTNode.new('name' => "#{m_full_name.gsub( /:/,'_' )}",
+              @global_graph << DOT::Node.new('name' => "#{m_full_name.gsub( /:/,'_' )}",
                                         'shape' => 'box',
                                         'label' => "#{m_full_name}",
                                         'URL'   => %{"#{url}"})
               @global_names << m_full_name
             end
-            @global_graph << DOT::DOTEdge.new('from' => "#{m_full_name.gsub( /:/,'_' )}",
+            @global_graph << DOT::Edge.new('from' => "#{m_full_name.gsub( /:/,'_' )}",
                                       'to' => "#{mod.full_name.gsub( /:/,'_' )}",
                                       'lhead' => "cluster_#{mod.full_name.gsub( /:/,'_' )}")
           end
@@ -173,7 +173,7 @@
 
       # create dummy node (needed if empty and for module includes)
       if container.full_name
-        graph << DOT::DOTNode.new('name'     => "#{container.full_name.gsub( /:/,'_' )}",
+        graph << DOT::Node.new('name'     => "#{container.full_name.gsub( /:/,'_' )}",
                                   'label'    => "",
                                   'width'  => (container.classes.empty? and 
                                                container.modules.empty?) ? 
@@ -187,7 +187,7 @@
         if use_fileboxes && !files.include?(last_file)
           @counter += 1
           files[last_file] =
-            DOT::DOTSubgraph.new('name'     => "cluster_#{@counter}",
+            DOT::Subgraph.new('name'     => "cluster_#{@counter}",
                                  'label'    => "#{last_file}",
                                  'fontname' => FONT,
                                  'color'=>
@@ -217,7 +217,7 @@
           'URL'   => %{"#{url}"}
         }
 
-        c = DOT::DOTNode.new(attrs)
+        c = DOT::Node.new(attrs)
         
         if use_fileboxes
           files[last_file].push c 
@@ -237,20 +237,20 @@
           cl.includes.each do |m|
             m_full_name = find_full_name(m.name, cl)
             if @local_names.include?(m_full_name)
-              @global_graph << DOT::DOTEdge.new('from' => "#{m_full_name.gsub( /:/,'_' )}",
+              @global_graph << DOT::Edge.new('from' => "#{m_full_name.gsub( /:/,'_' )}",
                                       'to' => "#{cl.full_name.gsub( /:/,'_' )}",
                                       'ltail' => "cluster_#{m_full_name.gsub( /:/,'_' )}")
             else
               unless @global_names.include?(m_full_name)
                 path = m_full_name.split("::")
                 url = File.join('classes', *path) + ".html"
-                @global_graph << DOT::DOTNode.new('name' => "#{m_full_name.gsub( /:/,'_' )}",
+                @global_graph << DOT::Node.new('name' => "#{m_full_name.gsub( /:/,'_' )}",
                                           'shape' => 'box',
                                           'label' => "#{m_full_name}",
                                           'URL'   => %{"#{url}"})
                 @global_names << m_full_name
               end
-              @global_graph << DOT::DOTEdge.new('from' => "#{m_full_name.gsub( /:/,'_' )}",
+              @global_graph << DOT::Edge.new('from' => "#{m_full_name.gsub( /:/,'_' )}",
                                       'to' => "#{cl.full_name.gsub( /:/, '_')}")
             end
           end
@@ -261,13 +261,13 @@
           unless @local_names.include?(sclass_full_name) or @global_names.include?(sclass_full_name)
             path = sclass_full_name.split("::")
             url = File.join('classes', *path) + ".html"
-            @global_graph << DOT::DOTNode.new(
+            @global_graph << DOT::Node.new(
                        'name' => "#{sclass_full_name.gsub( /:/, '_' )}",
                        'label' => sclass_full_name,
                        'URL'   => %{"#{url}"})
             @global_names << sclass_full_name
           end
-          @global_graph << DOT::DOTEdge.new('from' => "#{sclass_full_name.gsub( /:/,'_' )}",
+          @global_graph << DOT::Edge.new('from' => "#{sclass_full_name.gsub( /:/,'_' )}",
                                     'to' => "#{cl.full_name.gsub( /:/, '_')}")
         end
       end
@@ -313,12 +313,12 @@
     def wrap_in_image_map(src, dot)
       res = %{<map id="map" name="map">\n}
       dot_map = `dot -Tismap #{src}`
-      dot_map.each do |area|
+      dot_map.split($/).each do |area|
         unless area =~ /^rectangle \((\d+),(\d+)\) \((\d+),(\d+)\) ([\/\w.]+)\s*(.*)/
           $stderr.puts "Unexpected output from dot:\n#{area}"
           return nil
         end
-        
+
         xs, ys = [$1.to_i, $3.to_i], [$2.to_i, $4.to_i]
         url, area_name = $5, $6
 
Index: lib/rdoc/dot.rb
===================================================================
--- lib/rdoc/dot.rb	(revision 0)
+++ lib/rdoc/dot.rb	(revision 14762)
@@ -0,0 +1,247 @@
+module DOT
+
+  TAB = '  '
+  TAB2 = TAB * 2
+
+  # options for node declaration
+  NODE_OPTS = [
+    'bgcolor',
+    'color',
+    'fontcolor',
+    'fontname',
+    'fontsize',
+    'height',
+    'width',
+    'label',
+    'layer',
+    'rank',
+    'shape',
+    'shapefile',
+    'style',
+    'URL',
+  ]
+
+  # options for edge declaration
+  EDGE_OPTS = [
+    'color',
+    'decorate',
+    'dir',
+    'fontcolor',
+    'fontname',
+    'fontsize',
+    'id',
+    'label',
+    'layer',
+    'lhead',
+    'ltail',
+    'minlen',
+    'style',
+    'weight'
+  ]
+
+  # options for graph declaration
+  GRAPH_OPTS = [
+    'bgcolor',
+    'center',
+    'clusterrank',
+    'color',
+    'compound',
+    'concentrate',
+    'fillcolor',
+    'fontcolor',
+    'fontname',
+    'fontsize',
+    'label',
+    'layerseq',
+    'margin',
+    'mclimit',
+    'nodesep',
+    'nslimit',
+    'ordering',
+    'orientation',
+    'page',
+    'rank',
+    'rankdir',
+    'ranksep',
+    'ratio',
+    'size',
+    'style',
+    'URL'
+  ]
+
+  # a root class for any element in dot notation
+  class SimpleElement
+    attr_accessor :name
+
+    def initialize( params = {} )
+      @label = params['name'] ? params['name'] : ''
+    end
+
+    def to_s
+      @name
+    end
+  end
+
+  # an element that has options ( node, edge or graph )
+  class Element < SimpleElement
+    #attr_reader :parent
+    attr_accessor :name, :options
+
+    def initialize( params = {}, option_list = [] )
+      super( params )
+      @name = params['name'] ? params['name'] : nil
+      @parent = params['parent'] ? params['parent'] : nil
+      @options = {}
+      option_list.each{ |i|
+        @options[i] = params[i] if params[i]
+      }
+      @options['label'] ||= @name if @name != 'node'
+    end
+
+    def each_option
+      @options.each{ |i| yield i }
+    end
+
+    def each_option_pair
+      @options.each_pair{ |key, val| yield key, val }
+    end
+
+    #def parent=( thing )
+    #    @parent.delete( self ) if defined?( @parent ) and @parent
+    #    @parent = thing
+    #end
+  end
+
+
+  # this is used when we build nodes that have shape=record
+  # ports don't have options :)
+  class Port < SimpleElement
+    attr_accessor :label
+
+    def initialize( params = {} )
+      super( params )
+      @name = params['label'] ? params['label'] : ''
+    end
+    def to_s
+      ( @name && @name != "" ? "<#{@name}>" : "" ) + "#{@label}"
+    end
+  end
+
+  # node element
+  class Node < Element
+
+    def initialize( params = {}, option_list = NODE_OPTS )
+      super( params, option_list )
+      @ports = params['ports'] ? params['ports'] : []
+    end
+
+    def each_port
+      @ports.each{ |i| yield i }
+    end
+
+    def << ( thing )
+      @ports << thing
+    end
+
+    def push ( thing )
+      @ports.push( thing )
+    end
+
+    def pop
+      @ports.pop
+    end
+
+    def to_s( t = '' )
+
+      label = @options['shape'] != 'record' && @ports.length == 0 ?
+        @options['label'] ?
+        t + TAB + "label = \"#{@options['label']}\"\n" :
+                    '' :
+                    t + TAB + 'label = "' + " \\\n" +
+                    t + TAB2 + "#{@options['label']}| \\\n" +
+                    @ports.collect{ |i|
+        t + TAB2 + i.to_s
+      }.join( "| \\\n" ) + " \\\n" +
+        t + TAB + '"' + "\n"
+
+        t + "#{@name} [\n" +
+        @options.to_a.collect{ |i|
+        i[1] && i[0] != 'label' ?
+          t + TAB + "#{i[0]} = #{i[1]}" : nil
+      }.compact.join( ",\n" ) + ( label != '' ? ",\n" : "\n" ) +
+        label +
+        t + "]\n"
+    end
+  end
+
+  # subgraph element is the same to graph, but has another header in dot
+  # notation
+  class Subgraph < Element
+
+    def initialize( params = {}, option_list = GRAPH_OPTS )
+      super( params, option_list )
+      @nodes = params['nodes'] ? params['nodes'] : []
+      @dot_string = 'subgraph'
+    end
+
+    def each_node
+      @nodes.each{ |i| yield i }
+    end
+
+    def << ( thing )
+      @nodes << thing
+    end
+
+    def push( thing )
+      @nodes.push( thing )
+    end
+
+    def pop
+      @nodes.pop
+    end
+
+    def to_s( t = '' )
+      hdr = t + "#{@dot_string} #{@name} {\n"
+
+      options = @options.to_a.collect{ |name, val|
+        val && name != 'label' ?
+          t + TAB + "#{name} = #{val}" :
+        name ? t + TAB + "#{name} = \"#{val}\"" : nil
+      }.compact.join( "\n" ) + "\n"
+
+      nodes = @nodes.collect{ |i|
+        i.to_s( t + TAB )
+      }.join( "\n" ) + "\n"
+      hdr + options + nodes + t + "}\n"
+    end
+  end
+
+  # this is graph
+  class Digraph < Subgraph
+    def initialize( params = {}, option_list = GRAPH_OPTS )
+      super( params, option_list )
+      @dot_string = 'digraph'
+    end
+  end
+
+  # this is edge
+  class Edge < Element
+    attr_accessor :from, :to
+    def initialize( params = {}, option_list = EDGE_OPTS )
+      super( params, option_list )
+      @from = params['from'] ? params['from'] : nil
+      @to = params['to'] ? params['to'] : nil
+    end
+
+    def to_s( t = '' )
+      t + "#{@from} -> #{to} [\n" +
+        @options.to_a.collect{ |i|
+        i[1] && i[0] != 'label' ?
+          t + TAB + "#{i[0]} = #{i[1]}" :
+        i[1] ? t + TAB + "#{i[0]} = \"#{i[1]}\"" : nil
+      }.compact.join( "\n" ) + "\n" + t + "]\n"
+    end
+  end
+
+end
+

Property changes on: lib/rdoc/dot.rb
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + LF


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧]