<?xml version="1.0" encoding="windows-1252"?>
<node id="1002739" title="Re: Challenge: Dumping trees." created="2012-11-07 15:38:13" updated="2012-11-07 15:38:13">
<type id="11">
note</type>
<author id="145694">
brx</author>
<data>
<field name="doctext">
  &lt;p&gt;
     I know it's a little bit late... &lt;/p&gt;

  &lt;code&gt;

use strict;

my $sp = 1;


my $tree = [
    [
        [[[[["alpha", "bravo"], "charlie"], ["delta", "echo"]], [[["foxtrot", "golf"], "hotel"], [["indigo", "juliet"], ["kilo", ["lima", "mike"]]]]],
        ["november", [[["oscar", "papa"], "quebec"], ["romeo", "sierra"]]]], ["tango", ["uniform", "victor"]]
    ],
    [["whiskey", ["xray", "yankee"]], "zulu"]
];



my $lowerline = 0;
my $nodecount =0;
sub scantree {
    my ($node,$level) = @_;
    if (ref($node)) {
        $level++;
        scantree($_,$level) for (@$node);
    } else {
        $nodecount++;
        my $ground = $level + length($node);
        $lowerline = $ground if ($ground &gt; $lowerline);
    }
}
scantree($tree,0); # get number of columns and lines ($nodecount(* $sp) and $lowerline)

my @output = (" " x ((1+$sp)*$nodecount)) x ($lowerline+1);
$nodecount = 0; #reset
sub show {
    my ($node,$level,$rl) = @_;
    if (ref($node)) {
        my $left=0; #0 is right // 1 is left
        my @po;
        for my $n (@$node) {
            $po[$left] = show($n,$level+1,$left);
            $left++;
        }
        #                                            ____
        #                                           /size\
        my $size = $po[1]-$po[0]-1;
        substr($output[$level]  , $po[0]+1, $size,  "_" x $size);
        substr($output[$level+1], $po[0]  , 1    , "/");
        substr($output[$level+1], $po[1]  , 1    ,      "\\");
        return($po[1-$rl]); #child return "hook" position to parent
    } else {
        $nodecount++;
        my $p = ($nodecount-1)*($sp+1);
        for my $l (1 .. length($node)) {
            substr($output[$level+$l], $p+$sp, 1, substr($node,$l-1,1)); #write $node vertically
        }
        return ($p+$sp); # child returns his position to parent
    }
}
show($tree,0,0);
my $out = join "\n",@output;
print "$out\n";
__END__
#lowcost new view :
my $col = length (($out=~/.(.*)/)[0]); 
my $numlines = $out=~ tr/\n//;
for my $x (0 .. $col) {
    for my $y (0 .. $numlines) {
	my $ch = substr($out,$x+$y*($col+2),1);
	$ch =~ tr/_/|/;
	print $ch;
    }
    print "\n";
}
__DATA__
$sp=1
                                        _______
                            ___________/       \___
                ___________/           \_     _/   \
        _______/           \_____      / \_  / \_  z
      _/       \___        /     \_    t / \ w / \ u
    _/ \_     _/   \_      n    _/ \_  a u v h x y l
  _/ \ / \  _/ \  _/ \_    o  _/ \ / \ n n i i r a u
 / \ c d e / \ h / \ / \_  v / \ q r s g i c s a n
 a b h e c f g o i j k / \ e o p u o i o f t k y k
 l r a l h o o t n u i l m m s a e m e   o o e   e
 p a r t o x l e d l l i i b c p b e r   r r y   e
 h v l a   t f l i i o m k e a a e o r   m
 a o i     r     g e   a e r r   c   a
     e     o     o t
           t
-----
$sp=2
                                                            ___________
                                          _________________/           \_____
                        _________________/                 \__       __/     \
            ___________/                 \________         /  \__   /  \__   z
         __/           \_____            /        \__      t  /  \  w  /  \  u
      __/  \__       __/     \__         n      __/  \__   a  u  v  h  x  y  l
   __/  \  /  \   __/  \   __/  \__      o   __/  \  /  \  n  n  i  i  r  a  u
  /  \  c  d  e  /  \  h  /  \  /  \__   v  /  \  q  r  s  g  i  c  s  a  n
  a  b  h  e  c  f  g  o  i  j  k  /  \  e  o  p  u  o  i  o  f  t  k  y  k
  l  r  a  l  h  o  o  t  n  u  i  l  m  m  s  a  e  m  e     o  o  e     e
  p  a  r  t  o  x  l  e  d  l  l  i  i  b  c  p  b  e  r     r  r  y     e
  h  v  l  a     t  f  l  i  i  o  m  k  e  a  a  e  o  r     m
  a  o  i        r        g  e     a  e  r  r     c     a
        e        o        o  t
                 t
-----
$sp=3
                                                                                _______________
                                                        _______________________/               \_______
                                _______________________/                       \___         ___/       \
                _______________/                       \___________            /   \___    /   \___    z
            ___/               \_______                /           \___        t   /   \   w   /   \   u
        ___/   \___         ___/       \___            n        ___/   \___    a   u   v   h   x   y   l
    ___/   \   /   \    ___/   \    ___/   \___        o    ___/   \   /   \   n   n   i   i   r   a   u
   /   \   c   d   e   /   \   h   /   \   /   \___    v   /   \   q   r   s   g   i   c   s   a   n
   a   b   h   e   c   f   g   o   i   j   k   /   \   e   o   p   u   o   i   o   f   t   k   y   k
   l   r   a   l   h   o   o   t   n   u   i   l   m   m   s   a   e   m   e       o   o   e       e
   p   a   r   t   o   x   l   e   d   l   l   i   i   b   c   p   b   e   r       r   r   y       e
   h   v   l   a       t   f   l   i   i   o   m   k   e   a   a   e   o   r       m
   a   o   i           r           g   e       a   e   r   r       c       a
           e           o           o   t
                       t
-----
$sp=0
                    ___
              _____/   \_
        _____/     \   / \
    ___/     \__   /\ /\ z
   /   \_    /  \  t/\w/\u
  /\   / \   n  /\ auvhxyl
 /\/\ /\ /\  o /\/\nniirau
/\cde/\h/\/\ v/\qrsgicsan
abhecfgoijk/\eopuoioftkyk
lralhootnuilmmsaeme ooe e
partoxledlliibcpber rry e
hvla tfliiomkeaaeor m
aoi  r  ge aerr c a
  e  o  ot
     t
----
lowcost new view ($sp=1)

       /alpha  
      |        
      /\bravo  
     |         
     /\charlie 
    |          
    /\/delta   
   | |         
   |  \echo    
   |           
   |   /foxtrot
   |  |        
   |  /\golf   
   | |         
   /\/\hotel   
  | |          
  | |  /indigo 
  | | |        
  |  \/\juliet 
  |  |         
  |   \/kilo   
  |   |        
  |    \/lima  
  |    |       
  |     \mike  
  |            
  /\/november  
 | |           
 | |   /oscar  
 | |  |        
 | |  /\papa   
 | | |         
 |  \/\quebec  
 |  |          
 |   \/romeo   
 |   |         
 |    \sierra  
 |             
 /\/tango      
| |            
|  \/uniform   
|  |           
|   \victor    
|              
|  /whiskey    
| |            
 \/\/xray      
 | |           
 |  \yankee    
 |             
  \zulu        

  &lt;/code&gt;
&lt;div class="pmsig"&gt;&lt;div class="pmsig-145694"&gt;
English is not my mother tongue.&lt;br&gt;
&lt;i&gt;Les tongues de ma mère sont "made in France".&lt;/i&gt;

&lt;/div&gt;&lt;/div&gt;</field>
<field name="root_node">
998803</field>
<field name="parent_node">
998803</field>
</data>
</node>
