[Bio] / FigKernelPackages / gjonewicklib.pm Repository:
ViewVC logotype

Diff of /FigKernelPackages/gjonewicklib.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.13, Wed Jul 1 00:08:52 2009 UTC revision 1.14, Tue Jul 7 22:14:22 2009 UTC
# Line 3362  Line 3362 
3362  }  }
3363    
3364    
3365    #===============================================================================
3366    #  Character sets for printer plot trees:
3367  #-------------------------------------------------------------------------------  #-------------------------------------------------------------------------------
3368  #  Character sets for tree:  
 #-------------------------------------------------------------------------------  
 my $default_chars = 'text1';  
3369  my %char_set =  my %char_set =
3370    ( text1     => { space  => ' ',    ( text1     => { space  => ' ',
3371                     horiz  => '-',                     horiz  => '-',
# Line 3384  Line 3384 
3384                     half_d => '|',                     half_d => '|',
3385                     cross  => '+',                     cross  => '+',
3386                   },                   },
     html1     => { space  => ' ',  
                    horiz  => '-',  
                    vert   => '|',  
                    el_d_r => '/',  
                    el_u_r => '\\',  
                    el_d_l => '\\',  
                    el_u_l => '/',  
                    tee_l  => '+',  
                    tee_r  => '+',  
                    tee_u  => '+',  
                    tee_d  => '+',  
                    half_l => '-',  
                    half_r => '-',  
                    half_u => '|',  
                    half_d => '|',  
                    cross  => '+',  
                  },  
3387      text2     => { space  => ' ',      text2     => { space  => ' ',
3388                     horiz  => '-',                     horiz  => '-',
3389                     vert   => '|',                     vert   => '|',
# Line 3418  Line 3401 
3401                     half_d => '|',                     half_d => '|',
3402                     cross  => '+',                     cross  => '+',
3403                   },                   },
3404      html2     => { space  => ' ',      html_box  => { space  => ' ',
                    horiz  => '-',  
                    vert   => '|',  
                    el_d_r => '+',  
                    el_u_r => '+',  
                    el_d_l => '+',  
                    el_u_l => '+',  
                    tee_l  => '+',  
                    tee_r  => '+',  
                    tee_u  => '+',  
                    tee_d  => '+',  
                    half_l => '-',  
                    half_r => '-',  
                    half_u => '|',  
                    half_d => '|',  
                    cross  => '+',  
                  },  
     utf8_symb => { space  => ' ',  
                    horiz  => chr(226) . chr(148) . chr(128),  
                    vert   => chr(226) . chr(148) . chr(130),  
                    el_d_r => chr(226) . chr(148) . chr(140),  
                    el_u_r => chr(226) . chr(148) . chr(148),  
                    el_d_l => chr(226) . chr(148) . chr(144),  
                    el_u_l => chr(226) . chr(148) . chr(152),  
                    tee_l  => chr(226) . chr(148) . chr(164),  
                    tee_r  => chr(226) . chr(148) . chr(156),  
                    tee_u  => chr(226) . chr(148) . chr(180),  
                    tee_d  => chr(226) . chr(148) . chr(172),  
                    half_l => chr(226) . chr(149) . chr(180),  
                    half_r => chr(226) . chr(149) . chr(182),  
                    half_u => chr(226) . chr(149) . chr(181),  
                    half_d => chr(226) . chr(149) . chr(183),  
                    cross  => chr(226) . chr(148) . chr(188),  
                  },  
     html_symb => { space  => ' ',  
3405                     horiz  => '─',                     horiz  => '─',
3406                     vert   => '│',                     vert   => '│',
3407                     el_d_r => '┌',                     el_d_r => '┌',
# Line 3469  Line 3418 
3418                     half_d => '╷',                     half_d => '╷',
3419                     cross  => '┼',                     cross  => '┼',
3420                   },                   },
3421      html_tbl  => { space  => '<TD>&nbsp;</TD>',      utf8_box  => { space  => ' ',
3422                     horiz  => '<TD>&#9472;</TD>',                     horiz  => chr(226) . chr(148) . chr(128),
3423                     vert   => '<TD>&#9474;</TD>',                     vert   => chr(226) . chr(148) . chr(130),
3424                     el_d_r => '<TD>&#9484;</TD>',                     el_d_r => chr(226) . chr(148) . chr(140),
3425                     el_u_r => '<TD>&#9492;</TD>',                     el_u_r => chr(226) . chr(148) . chr(148),
3426                     el_d_l => '<TD>&#9488;</TD>',                     el_d_l => chr(226) . chr(148) . chr(144),
3427                     el_u_l => '<TD>&#9496;</TD>',                     el_u_l => chr(226) . chr(148) . chr(152),
3428                     tee_l  => '<TD>&#9508;</TD>',                     tee_l  => chr(226) . chr(148) . chr(164),
3429                     tee_r  => '<TD>&#9500;</TD>',                     tee_r  => chr(226) . chr(148) . chr(156),
3430                     tee_u  => '<TD>&#9524;</TD>',                     tee_u  => chr(226) . chr(148) . chr(180),
3431                     tee_d  => '<TD>&#9516;</TD>',                     tee_d  => chr(226) . chr(148) . chr(172),
3432                     half_l => '<TD>&#9588;</TD>',                     half_l => chr(226) . chr(149) . chr(180),
3433                     half_r => '<TD>&#9590;</TD>',                     half_r => chr(226) . chr(149) . chr(182),
3434                     half_u => '<TD>&#9589;</TD>',                     half_u => chr(226) . chr(149) . chr(181),
3435                     half_d => '<TD>&#9591;</TD>',                     half_d => chr(226) . chr(149) . chr(183),
3436                     cross  => '<TD>&#9532;</TD>',                     cross  => chr(226) . chr(148) . chr(188),
3437                   },                   },
3438    );    );
3439    
3440    %{ $char_set{ html1 } } = %{ $char_set{ text1 } };
3441    $char_set{ html1 }->{ space } = '&nbsp;';
3442    
3443    %{ $char_set{ html2 } } = %{ $char_set{ text2 } };
3444    $char_set{ html2 }->{ space } = '&nbsp;';
3445    
3446  #  Define some synonyms  #  Define some synonyms
3447  $char_set{ html } = $char_set{ html_symb };  
3448  $char_set{ line } = $char_set{ html_symb };  $char_set{ html } = $char_set{ html_box };
3449  $char_set{ symb } = $char_set{ html_symb };  $char_set{ line } = $char_set{ utf8_box };
3450    $char_set{ symb } = $char_set{ utf8_box };
3451  $char_set{ text } = $char_set{ text1 };  $char_set{ text } = $char_set{ text1 };
3452  $char_set{ utf8 } = $char_set{ utf8_symb };  $char_set{ utf8 } = $char_set{ utf8_box };
3453    
3454    #  Define tree formats and synonyms
3455    
3456    my %tree_format =
3457        ( text         => 'text',
3458          tree_tab_lbl => 'tree_tab_lbl',
3459          tree_lbl     => 'tree_lbl',
3460          chrlist_lbl  => 'chrlist_lbl',
3461          raw          => 'chrlist_lbl',
3462        );
3463    
3464  #===============================================================================  #===============================================================================
3465  #  Make a text plot of a tree:  #  Make a text plot of a tree:
# Line 3509  Line 3474 
3474  #  #
3475  #  Options:  #  Options:
3476  #  #
3477    #    chars  => keyword       # the output character set for the tree
3478  #    dy     => nat_number    # the vertical space per taxon  #    dy     => nat_number    # the vertical space per taxon
3479  #    chars  => key           # line drawing character set:  #    format => keyword       # output format of each line
 #                            #     html_unicode  
 #                            #     text (default)  
3480  #    min_dx => whole_number  # the minimum horizontal branch length  #    min_dx => whole_number  # the minimum horizontal branch length
3481  #    width  => whole_number  # approximate tree width without labels  #    width  => whole_number  # approximate tree width without labels
3482  #  #
3483    #  Character sets:
3484    #
3485    #    html       #  synonym of html1
3486    #    html_box   #  html encoding of unicode box drawing characters
3487    #    html1      #  text1 with nonbreaking spaces
3488    #    html2      #  text2 with nonbreaking spaces
3489    #    line       #  synonym of utf8_box
3490    #    raw        #  pass out the internal representation
3491    #    symb       #  synonym of utf8_box
3492    #    text       #  synonym of text1 (Default)
3493    #    text1      #  ascii characters: - + | / \ and space
3494    #    text2      #  ascii characters: - + | + + and space
3495    #    utf8       #  synonym of utf8_box
3496    #    utf8_box   #  utf8 encoding of unicode box drawing characters
3497    #
3498    #  Formats for row lines:
3499    #
3500    #    text           #    $textstring              # Default
3501    #    tree_tab_lbl   #    $treestr \t $labelstr
3502    #    tree_lbl       # [  $treestr,  $labelstr ]
3503    #    chrlist_lbl    # [ \@treechar, $labelstr ]   # Forced with raw chars
3504    #    raw            #  synonym of chrlist_lbl
3505    #
3506  #===============================================================================  #===============================================================================
3507  sub text_plot_newick  sub text_plot_newick
3508  {  {
3509      my $node = shift @_;      my $node = shift @_;
3510      array_ref( $node ) || die "Bad node passed to text_plot_newick\n";      array_ref( $node ) || die "Bad node passed to text_plot_newick\n";
3511    
3512      my ( $opts, $width, $min_dx, $dy, $chars, $cells );      my ( $opts, $width, $min_dx, $dy, $chars, $fmt );
3513      if ( $_[0] && ref $_[0] eq 'HASH' )      if ( $_[0] && ref $_[0] eq 'HASH' )
3514      {      {
3515          $opts = shift;          $opts = shift;
3516      }      }
3517      else      else
3518      {      {
         $opts = {};  
3519          ( $width, $min_dx, $dy ) = @_;          ( $width, $min_dx, $dy ) = @_;
3520            $opts = {};
3521      }      }
3522    
3523      $chars  = $opts->{ chars  } if defined $opts->{ chars  };      $chars = $opts->{ chars } || '';
3524      $dy     = $opts->{ dy     } if defined $opts->{ dy     };      my $charH;
3525      $min_dx = $opts->{ min_dx } if defined $opts->{ min_dx };      $charH = $char_set{ $chars } || $char_set{ 'text1' } if ( $chars ne 'raw' );
3526      $width  = $opts->{ width  } if defined $opts->{ width  };      my $is_box = $charH eq $char_set{ html_box }
3527      $cells  = $opts->{ cells  } if defined $opts->{ cells  };                || $charH eq $char_set{ utf8_box }
3528                  || $chars eq 'raw';
3529      defined( $chars ) and ( $char_set{ $chars } ) or $chars = $default_chars;  
3530      my $ch = $char_set{ $chars };      $fmt = ( $chars eq 'raw' ) ? 'chrlist_lbl' : $opts->{ format };
3531        $fmt = $tree_format{ $fmt || '' } || 'text';
3532      defined(     $dy ) and (     $dy >=  1 ) or     $dy =  1;  
3533      defined( $min_dx ) and ( $min_dx >=  0 ) or $min_dx =  2;      $dy    ||= $opts->{ dy     } ||  1;
3534      defined(  $width ) and (  $width >=  1 ) or  $width = 68;      $width ||= $opts->{ width  } || 68;
3535        $min_dx  = $opts->{ min_dx } if ( ! defined $min_dx || $min_dx < 0 );
3536        $min_dx  = $is_box ? 1 : 2   if ( ! defined $min_dx || $min_dx < 0 );
3537    
3538        #  Layout the tree:
3539    
3540      $min_dx = int( $min_dx );      $min_dx = int( $min_dx );
3541      $dy     = int( $dy );      $dy     = int( $dy );
# Line 3553  Line 3544 
3544      my $hash = {};      my $hash = {};
3545      layout_printer_plot( $node, $hash, 0, -0.5 * $dy, $x_scale, $min_dx, $dy );      layout_printer_plot( $node, $hash, 0, -0.5 * $dy, $x_scale, $min_dx, $dy );
3546    
3547      # dump_tree_hash( $node, $hash ); exit;      #  Generate the lines of the tree-one by-one:
   
     #  Generate the lines of the tree one by one:  
3548    
3549      my ( $y1, $y2 ) = @{ $hash->{ $node } };      my ( $y1, $y2 ) = @{ $hash->{ $node } };
3550        my @lines;
3551      my @lines = map { text_tree_row( $node, $hash, $_, [], $ch->{tee_l} , $ch ) } ( $y1 .. $y2 );      foreach ( ( $y1 .. $y2 ) )
     if ( $cells )  
3552      {      {
3553          my $nmax = 0;          my $line = text_tree_row( $node, $hash, $_, [], 'tee_l' );
3554          foreach ( @lines ) { $nmax = @$_ if @$_ > $nmax }          my $lbl  = '';
3555          foreach ( @lines )          if ( @$line )
3556          {          {
3557              @$_ = map { "<TD>$_</TD>" } @$_;              if ( $line->[-1] eq '' ) { pop @$line; $lbl = pop @$line }
3558              my $span = $nmax - @$_ + 1;              #  Translate tree characters
3559              $_->[-1] =~ s/^<TD>/<TD NoWrap ColSpan=$span>/;              @$line = map { $charH->{ $_ } } @$line if $chars ne 'raw';
3560          }          }
3561      }  
3562            # Convert to requested output format:
3563    
3564            push @lines, $fmt eq 'text'         ? join( '', @$line, ( $lbl ? " $lbl" : () ) )
3565                       : $fmt eq 'text_tab_lbl' ? join( '', @$line, "\t", $lbl )
3566                       : $fmt eq 'tree_lbl'     ? [ join( '', @$line ), $lbl ]
3567                       : $fmt eq 'chrlist_lbl'  ? [ $line, $lbl ]
3568                       :                          ();
3569        }
3570    
3571        # if ( $cells )
3572        # {
3573        #     my $nmax = 0;
3574        #     foreach ( @lines ) { $nmax = @$_ if @$_ > $nmax }
3575        #     foreach ( @lines )
3576        #     {
3577        #         @$_ = map { "<TD>$_</TD>" } @$_;
3578        #         my $span = $nmax - @$_ + 1;
3579        #         $_->[-1] =~ s/^<TD>/<TD NoWrap ColSpan=$span>/;
3580        #     }
3581        # }
3582        # elsif ( $tables )
3583        # {
3584        #     my $nmax = 0;
3585        #     foreach ( @lines ) { $nmax = @$_ if @$_ > $nmax }
3586        #     foreach ( @lines )
3587        #     {
3588        #         @$_ = map { "<TD>$_</TD>" } @$_;
3589        #         my $span = $nmax - @$_ + 1;
3590        #         $_->[-1] =~ s/^<TD>/<TD NoWrap ColSpan=$span>/;
3591        #     }
3592        # }
3593    
3594      map { join '', @$_ } @lines;      wantarray ? @lines : \@lines;
3595  }  }
3596    
3597    
3598  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3599  #  ( $xmax, $ymax, $root_y ) = layout_printer_plot( $node, $hash, $x0, $y0, $x_scale, $min_dx, $dy )  #  ( $xmax, $ymax, $root_y ) = layout_printer_plot( $node, $hash, $x0, $y0, $x_scale, $min_dx, $dy, $yrnd )
3600  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3601  sub layout_printer_plot  sub layout_printer_plot
3602  {  {
3603      my ( $node, $hash, $x0, $y0, $x_scale, $min_dx, $dy ) = @_;      my ( $node, $hash, $x0, $y0, $x_scale, $min_dx, $dy, $yrnd ) = @_;
3604      array_ref( $node ) || die "Bad node ref passed to layout_printer_plot\n";      array_ref( $node ) || die "Bad node ref passed to layout_printer_plot\n";
3605      hash_ref(  $hash ) || die "Bad hash ref passed to layout_printer_plot\n";      hash_ref(  $hash ) || die "Bad hash ref passed to layout_printer_plot\n";
3606    
3607      my $dx = newick_x( $node );      my $dx = newick_x( $node );
3608      if ( defined( $dx ) ) {      if ( defined( $dx ) ) {
3609          $dx *= $x_scale;          $dx *= $x_scale;
3610          $dx >= $min_dx or $dx = $min_dx;          $dx = $min_dx if $dx < $min_dx;
3611      }      }
3612      else {      else {
3613          $dx = ( $x0 > 0 ) ? $min_dx : 0;          $dx = ( $x0 > 0 ) ? $min_dx : 0;
# Line 3614  Line 3634 
3634          $ymax = $y0;          $ymax = $y0;
3635    
3636          foreach ( @dl ) {          foreach ( @dl ) {
3637              ( $xmaxi, $ymax, $yi ) = layout_printer_plot( $_, $hash, $x, $ymax, $x_scale, $min_dx, $dy );              ( $xmaxi, $ymax, $yi ) = layout_printer_plot( $_, $hash, $x, $ymax, $x_scale, $min_dx, $dy,
3638                                                              ( 2*@ylist < @dl ? 0.5001 : 0.4999 )
3639                                                            );
3640              push @ylist, $yi;              push @ylist, $yi;
3641              if ( $xmaxi > $xmax ) { $xmax = $xmaxi }              if ( $xmaxi > $xmax ) { $xmax = $xmaxi }
3642          }          }
# Line 3624  Line 3646 
3646    
3647          $yn1 = $ylist[ 0];          $yn1 = $ylist[ 0];
3648          $yn2 = $ylist[-1];          $yn2 = $ylist[-1];
3649          $y = int( 0.5 * ( $yn1 + $yn2 ) + 0.4999 );          $y = int( 0.5 * ( $yn1 + $yn2 ) + ( $yrnd || 0.4999 ) );
3650      }      }
3651    
3652      $y2 = int( $ymax - 0.5 * $dy + 0.4999 );      $y2 = int( $ymax - 0.5 * $dy + 0.4999 );
# Line 3634  Line 3656 
3656  }  }
3657    
3658    
3659    #  What symbol do we get if we add a leftward line to some other symbol?
3660    
3661    my %with_left_line = ( space  => 'half_l',
3662                           horiz  => 'horiz',
3663                           vert   => 'tee_l',
3664                           el_d_r => 'tee_d',
3665                           el_u_r => 'tee_u',
3666                           el_d_l => 'el_d_l',
3667                           el_u_l => 'el_u_l',
3668                           tee_l  => 'tee_l',
3669                           tee_r  => 'cross',
3670                           tee_u  => 'tee_u',
3671                           tee_d  => 'tee_d',
3672                           half_l => 'half_l',
3673                           half_r => 'horiz',
3674                           half_u => 'el_u_l',
3675                           half_d => 'el_d_l',
3676                           cross  => 'cross',
3677                         );
3678    
3679  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3680  #  \@line = text_tree_row( $node, $hash, $row, \@line, $symb, \%chars )  #  Produce a description of one line of a printer plot tree.
3681    #
3682    #  \@line = text_tree_row( $node, $hash, $row, \@line, $symb )
3683    #
3684    #     \@line is the character descriptions accumulated so far, one per array
3685    #          element, except for a label, which can be any number of characters.
3686    #          Labels are followed by an empty string, so if $line->[-1] eq '',
3687    #          then $line->[-2] is a label. The calling program translates the
3688    #          symbol names to output characters.
3689    #
3690    #     \@node is a newick tree node
3691    #     \%hash contains tree layout information
3692    #      $row  is the row number (y value) that we are building
3693    #      $symb is the plot symbol proposed for the current x and y position
3694    #
3695  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3696  sub text_tree_row  sub text_tree_row
3697  {  {
3698      my ( $node, $hash, $row, $line, $symb, $ch ) = @_;      my ( $node, $hash, $row, $line, $symb ) = @_;
3699    
3700      my ( $y1, $y2, $x0, $x, $y, $yn1, $yn2 ) = @{ $hash->{ $node } };      my ( $y1, $y2, $x0, $x, $y, $yn1, $yn2 ) = @{ $hash->{ $node } };
3701      if ( $row < $y1 || $row > $y2 ) { return $line }      if ( $row < $y1 || $row > $y2 ) { return $line }
3702    
3703      if ( @$line < $x0 ) { push @$line, ($ch->{space}) x ( $x0 - @$line ) }      if ( @$line < $x0 ) { push @$line, ('space') x ( $x0 - @$line ) }
3704    
3705      if ( $row == $y ) {      if ( $row == $y ) {
3706          @$line = ( @$line[ 0 .. $x0-1 ],          while ( @$line > $x0 ) { pop @$line }  # Actually 0-1 times
3707                     $symb,          push @$line, $symb,
3708                     ( ( $x > $x0 ) ? ($ch->{horiz}) x ($x - $x0) : () )                       ( ( $x > $x0 ) ? ('horiz') x ($x - $x0) : () );
                  );  
3709      }      }
3710    
3711      elsif ( $row > $yn1 && $row < $yn2 ) {      elsif ( $row > $yn1 && $row < $yn2 ) {
3712          if ( @$line < $x ) { push @$line, ($ch->{space}) x ( $x - @$line ), $ch->{vert} }          if ( @$line < $x ) { push @$line, ('space') x ( $x - @$line ), 'vert' }
3713          else               { $line->[$x] = $ch->{vert} }          else               { $line->[$x] = 'vert' }
3714      }      }
3715    
3716      my @dl = newick_desc_list( $node );      my @dl = newick_desc_list( $node );
3717    
3718      if ( @dl < 1 ) {      if ( @dl < 1 ) { push @$line, ( newick_lbl( $node ) || '' ), '' }
         push @$line, $ch->{space}, newick_lbl( $node );  
     }  
3719    
3720      else {      else {
3721          my @list = map { [ $_, $ch->{tee_r} ] } @dl;  # Line to the right          my @list = map { [ $_, 'tee_r' ] } @dl;  # Line to the right
3722          $list[ 0]->[1] = $ch->{el_d_r};          if ( @list > 1 ) { #  Fix top and bottom sympbols
3723          $list[-1]->[1] = $ch->{el_u_r};              $list[ 0]->[1] = 'el_d_r';
3724                $list[-1]->[1] = 'el_u_r';
3725            }
3726            elsif ( @list ) {  # Only one descendent
3727                $list[ 0]->[1] = 'half_r';
3728            }
3729          foreach ( @list ) {          foreach ( @list ) {
3730              my ( $n, $s ) = @$_;              my ( $n, $s ) = @$_;
3731              if ( $row >= $hash->{ $n }->[0] && $row <= $hash->{ $n }->[1] ) {              if ( $row >= $hash->{ $n }->[0] && $row <= $hash->{ $n }->[1] ) {
3732                  $line = text_tree_row( $n, $hash, $row, $line, $s, $ch );                  $line = text_tree_row( $n, $hash, $row, $line, $s );
3733              }              }
3734           }           }
3735    
3736          if ( $row == $y )          if ( $row == $y ) {
3737          {              $line->[$x] = ( $line->[$x] eq 'horiz' ) ? 'tee_l'
3738              if ( $line->[$x] eq $ch->{horiz} )                                                       : $with_left_line{ $line->[$x] };
             {  
                 $line->[$x] = $ch->{tee_l};  
             }  
             else  
             {  
                 $line->[$x] = add_left_line( $ch, $line->[$x] );  
             }  
3739          }          }
3740      }      }
3741    
# Line 3693  Line 3743 
3743  }  }
3744    
3745    
 #  To correctly resolve an ambuiguity, order matters:  
   
 my @symbs = qw( space   horiz   vert    cross  
                 el_d_l  el_u_l  el_d_r  el_u_r  
                 tee_l   tee_r   tee_u   tee_d  
                 half_l  half_r  half_u  half_d  
               );  
   
 my %with_left = ( space  => 'half_l',  
                   horiz  => 'horiz',  
                   vert   => 'tee_l',  
                   el_d_r => 'tee_d',  
                   el_u_r => 'tee_u',  
                   el_d_l => 'el_d_l',  
                   el_u_l => 'el_u_l',  
                   tee_l  => 'tee_l',  
                   tee_r  => 'cross',  
                   tee_u  => 'tee_u',  
                   tee_d  => 'tee_d',  
                   half_l => 'half_l',  
                   half_r => 'horiz',  
                   half_u => 'el_u_l',  
                   half_d => 'el_d_l',  
                   cross  => 'cross',  
                 );  
   
 my %add_left;  
   
 sub add_left_line  
 {  
     my ( $ch, $c ) = @_;  
   
     #  Build the translation table for the character set, if necessary:  
     if ( ! $add_left{ $ch } )  
     {  
         %{ $add_left{ $ch } } = map { $ch->{ $_ } => $ch->{ $with_left{ $_ } } }  
                                 @symbs;  
     }  
   
     return $add_left{ $ch }->{ $c };  
 }  
   
   
3746  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3747  #  Debug routine  #  Debug routine
3748  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Legend:
Removed from v.1.13  
changed lines
  Added in v.1.14

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3