File Coverage

blib/lib/Tree/Cladogram.pm
Criterion Covered Total %
statement 12 280 4.2
branch 0 72 0.0
condition 0 36 0.0
subroutine 4 31 12.9
pod 1 10 10.0
total 17 429 3.9


line stmt bran cond sub pod time code
1             package Tree::Cladogram;
2              
3 2     2   2236 use File::Slurper 'read_lines';
  2         29642  
  2         151  
4              
5 2     2   1201 use Moo;
  2         26026  
  2         13  
6              
7 2     2   6817 use Tree::DAG_Node;
  2         39504  
  2         112  
8              
9 2     2   1589 use Types::Standard qw/Any Int Str/;
  2         160689  
  2         30  
10              
11             has branch_color =>
12             (
13             default => sub{return '#7e7e7e'},
14             is => 'rw',
15             isa => Str,
16             required => 0,
17             );
18              
19             has branch_width =>
20             (
21             default => sub{return 3},
22             is => 'rw',
23             isa => Int,
24             required => 0,
25             );
26              
27             has draw_frame =>
28             (
29             default => sub{return 0},
30             is => 'rw',
31             isa => Int,
32             required => 0,
33             );
34              
35             has debug =>
36             (
37             default => sub{return 0},
38             is => 'rw',
39             isa => Int,
40             required => 0,
41             );
42              
43             has final_x_step =>
44             (
45             default => sub{return 30},
46             is => 'rw',
47             isa => Int,
48             required => 0,
49             );
50              
51             has frame_color =>
52             (
53             default => sub{return '#0000ff'},
54             is => 'rw',
55             isa => Str,
56             required => 0,
57             );
58              
59             has input_file =>
60             (
61             default => sub{return ''},
62             is => 'rw',
63             isa => Str,
64             required => 0,
65             );
66              
67             has leaf_font_color =>
68             (
69             default => sub{return '#0000ff'},
70             is => 'rw',
71             isa => Str,
72             required => 0,
73             );
74              
75             has leaf_font_file =>
76             (
77             default => sub{return '/usr/share/fonts/truetype/freefont/FreeMono.ttf'},
78             is => 'rw',
79             isa => Str,
80             required => 0,
81             );
82              
83             has leaf_font_size =>
84             (
85             default => sub{return 16},
86             is => 'rw',
87             isa => Int,
88             required => 0,
89             );
90              
91             has left_margin =>
92             (
93             default => sub{return 15},
94             is => 'rw',
95             isa => Int,
96             required => 0,
97             );
98              
99             has maximum_x =>
100             (
101             default => sub{return 0},
102             is => 'rw',
103             isa => Int,
104             required => 0,
105             );
106              
107             has maximum_y =>
108             (
109             default => sub{return 0},
110             is => 'rw',
111             isa => Int,
112             required => 0,
113             );
114              
115             has minimum_sister_separation =>
116             (
117             default => sub{return 0},
118             is => 'rw',
119             isa => Int,
120             required => 0,
121             );
122              
123             has minimum_y =>
124             (
125             default => sub{return 0},
126             is => 'rw',
127             isa => Int,
128             required => 0,
129             );
130              
131             has output_file =>
132             (
133             default => sub{return ''},
134             is => 'rw',
135             isa => Str,
136             required => 0,
137             );
138              
139             has print_tree =>
140             (
141             default => sub{return 0},
142             is => 'rw',
143             isa => Int,
144             required => 0,
145             );
146              
147             has root =>
148             (
149             default => sub{return ''},
150             is => 'rw',
151             isa => Any,
152             required => 0,
153             );
154              
155             has title =>
156             (
157             default => sub{return ''},
158             is => 'rw',
159             isa => Str,
160             required => 0,
161             );
162              
163             has title_font_color =>
164             (
165             default => sub{return '#000000'},
166             is => 'rw',
167             isa => Str,
168             required => 0,
169             );
170              
171             has title_font_file =>
172             (
173             default => sub{return '/usr/share/fonts/truetype/freefont/FreeMono.ttf'},
174             is => 'rw',
175             isa => Str,
176             required => 0,
177             );
178              
179             has title_font_size =>
180             (
181             default => sub{return 16},
182             is => 'rw',
183             isa => Int,
184             required => 0,
185             );
186              
187             has title_width =>
188             (
189             default => sub{return 0},
190             is => 'rw',
191             isa => Int,
192             required => 0,
193             );
194              
195             has top_margin =>
196             (
197             default => sub{return 15},
198             is => 'rw',
199             isa => Int,
200             required => 0,
201             );
202              
203             has uid =>
204             (
205             default => sub{return 0},
206             is => 'rw',
207             isa => Int,
208             required => 0,
209             );
210              
211             has x_step =>
212             (
213             default => sub{return 50},
214             is => 'rw',
215             isa => Int,
216             required => 0,
217             );
218              
219             has y_step =>
220             (
221             default => sub{return 36},
222             is => 'rw',
223             isa => Int,
224             required => 0,
225             );
226              
227             our $VERSION = '1.04';
228              
229             # ------------------------------------------------
230              
231             sub BUILD
232             {
233 0     0 0   my($self) = @_;
234              
235 0           $self -> root($self -> new_node('0', {place => 'middle'}) );
236              
237             } # End of BUILD.
238              
239             # ------------------------------------------------
240              
241             sub _adjust_minimum_sister_separation
242             {
243 0     0     my($self) = @_;
244 0           my($minimum_y) = 0;
245 0           my($minimum_sister_separation) = $self -> minimum_sister_separation;
246              
247 0           my(@attributes, $actual_sister_separation);
248 0           my(@bounds);
249 0           my(@daughters);
250 0           my(@names, $new_sister_separation);
251              
252             $self -> root -> walk_down
253             ({
254             callback =>
255             sub
256             {
257 0     0     my($node) = @_;
258 0           @daughters = $node -> daughters;
259              
260 0 0         if ($#daughters == 2)
261             {
262 0           @attributes = map{$_ -> attributes} @daughters;
  0            
263 0           @names = map{$_ -> name} @daughters;
  0            
264              
265 0 0         return 1 if ($names[2] =~ /^\d+$/);
266              
267 0           $actual_sister_separation = ${$attributes[2]}{y} - ${$attributes[1]}{y};
  0            
  0            
268              
269 0 0         if ($actual_sister_separation >= $minimum_sister_separation)
270             {
271 0 0         $new_sister_separation = ($actual_sister_separation == $minimum_sister_separation) ? 6 : int( ($actual_sister_separation - $minimum_sister_separation) / 2);
272 0           ${$attributes[1]}{y} += $new_sister_separation;
  0            
273 0           ${$attributes[2]}{y} -= $new_sister_separation;
  0            
274 0           @bounds = map{$$_{bounds} } @attributes;
  0            
275 0           ${$bounds[1]}[1] += $new_sister_separation;
  0            
276 0           ${$bounds[1]}[3] += $new_sister_separation;
  0            
277 0           ${$bounds[2]}[1] -= $new_sister_separation;
  0            
278 0           ${$bounds[2]}[3] -= $new_sister_separation;
  0            
279              
280             # What's really scary is that I don't have to do this:
281             # ${$attributes[1]}{bounds} = $bounds[1];
282             # ${$attributes[2]}{bounds} = $bounds[2];
283              
284 0           $daughters[1] -> attributes($attributes[1]);
285 0           $daughters[2] -> attributes($attributes[2]);
286             }
287             }
288              
289 0           return 1; # Keep walking.
290             },
291 0           _depth => 0,
292             });
293              
294             } # End of _adjust_minimum_sister_separation.
295              
296             # ------------------------------------------------
297              
298             sub _calculate_basic_attributes
299             {
300 0     0     my($self) = @_;
301 0           my($x_step) = $self -> x_step;
302 0           my($y_step) = $self -> y_step;
303              
304 0           my($attributes);
305             my($parent_attributes);
306 0           my($scale);
307              
308             $self -> root -> walk_down
309             ({
310             callback =>
311             sub
312             {
313 0     0     my($node, $options) = @_;
314 0           $attributes = $node -> attributes;
315              
316             # Set defaults if steps are not provided.
317              
318 0   0       $$attributes{x_step} ||= $x_step;
319 0   0       $$attributes{y_step} ||= $y_step;
320              
321             # Set co-ords.
322              
323 0 0         if ($node -> is_root)
324             {
325 0           $$attributes{x} = 0;
326 0           $$attributes{y} = 0;
327             }
328             else
329             {
330             # $scale is a multiplier for the sister step.
331              
332             $scale = $$attributes{place} eq 'above'
333             ? -1
334 0 0         : $$attributes{place} eq 'middle'
    0          
335             ? 0
336             : 1;
337 0           $parent_attributes = $node -> mother -> attributes;
338 0           $$attributes{x} = $$parent_attributes{x} + $$attributes{x_step};
339 0           $$attributes{y} = $$parent_attributes{y} + $scale * $$attributes{y_step};
340             }
341              
342 0           $node -> attributes($attributes);
343              
344 0           return 1; # Keep walking.
345             },
346 0           _depth => 0,
347             });
348              
349             } # End of _calculate_basic_attributes.
350              
351             # ------------------------------------------------
352              
353             sub _calculate_minimum_sister_separation
354             {
355 0     0     my($self) = @_;
356 0           my($minimum_y) = 0;
357 0           my($minimum_sister_separation) = $self -> maximum_y;
358              
359 0           $self -> minimum_sister_separation($minimum_sister_separation);
360              
361 0           my(@attributes);
362             my(@daughters);
363 0           my(@names);
364 0           my($sister_separation);
365              
366             $self -> root -> walk_down
367             ({
368             callback =>
369             sub
370             {
371 0     0     my($node) = @_;
372 0           @daughters = $node -> daughters;
373              
374 0 0         if ($#daughters == 2)
375             {
376 0           @attributes = map{$_ -> attributes} @daughters;
  0            
377 0           @names = map{$_ -> name} @daughters;
  0            
378              
379 0 0         return 1 if ($names[2] =~ /^\d+$/);
380              
381 0           $sister_separation = ${$attributes[2]}{y} - ${$attributes[1]}{y};
  0            
  0            
382              
383 0 0         if ($sister_separation < $minimum_sister_separation)
384             {
385 0           $minimum_sister_separation = $sister_separation;
386             }
387             }
388              
389 0           return 1; # Keep walking.
390             },
391 0           _depth => 0,
392             });
393              
394 0           $self -> minimum_sister_separation($minimum_sister_separation);
395 0           $self -> _adjust_minimum_sister_separation;
396              
397             } # End of _calculate_minimum_sister_separation.
398              
399             # ------------------------------------------------
400              
401             sub _check_point_within_rectangle
402             {
403 0     0     my($self, $bounds_1, $x, $y) = @_;
404 0           my($result) = 0;
405 0           my($x_min) = $$bounds_1[0];
406 0           my($y_min) = $$bounds_1[1];
407 0           my($x_max) = $$bounds_1[2];
408 0           my($y_max) = $$bounds_1[3];
409              
410 0 0 0       if ( ($x >= $x_min) && ($x <= $x_max)
      0        
      0        
411             && ($y >= $y_min) && ($y <= $y_max) )
412             {
413 0           $result = 1;
414             }
415              
416 0           return $result;
417              
418             } # End of _check_point_within_rectangle.
419              
420             # ------------------------------------------------
421              
422             sub _check_rectangle_within_rectangle
423             {
424 0     0     my($self, $bounds_1, $bounds_2) = @_;
425 0           my($result) = 0;
426 0           my($x_min_2) = $$bounds_2[0];
427 0           my($y_min_2) = $$bounds_2[1];
428 0           my($x_max_2) = $$bounds_2[2];
429 0           my($y_max_2) = $$bounds_2[3];
430              
431 0 0 0       if ($self -> _check_point_within_rectangle($bounds_1, $x_min_2, $y_min_2)
      0        
      0        
432             || $self -> _check_point_within_rectangle($bounds_1, $x_max_2, $y_min_2)
433             || $self -> _check_point_within_rectangle($bounds_1, $x_min_2, $y_max_2)
434             || $self -> _check_point_within_rectangle($bounds_1, $x_max_2, $y_max_2) )
435             {
436 0           $result = 1;
437             }
438              
439 0           return $result;
440              
441             } # End of _check_rectangle_within_rectangle.
442              
443             # ------------------------------------------------
444              
445             sub _check_node_bounds
446             {
447 0     0     my($self, $node_1) = @_;
448 0           my($leaf_font_size) = $self -> leaf_font_size;
449 0           my($attributes_1) = $node_1 -> attributes;
450 0           my($bounds_1) = $$attributes_1{bounds};
451 0           my($uid_1) = $$attributes_1{uid};
452              
453 0           my($attributes_2);
454             my($bounds_2);
455 0           my($candidate_step);
456 0           my($parent_attributes);
457 0           my($uid_2);
458              
459             $self -> root -> walk_down
460             ({
461             callback =>
462             sub
463             {
464 0     0     my($node_2) = @_;
465 0           $attributes_2 = $node_2 -> attributes;
466 0           $bounds_2 = $$attributes_2{bounds};
467 0           $uid_2 = $$attributes_2{uid};
468              
469 0 0         if ($uid_1 < $uid_2)
470             {
471 0 0         if ($self -> _check_rectangle_within_rectangle($bounds_1, $bounds_2) )
472             {
473             # Move the node down to avoid the overlap.
474             # This assumes it's an 'above' node.
475             # The formula for $candidate_step is my own invention,
476             # selected after many experiments.
477              
478 0           $candidate_step = int($leaf_font_size / 2) + 8;
479 0           $$bounds_2[1] += $candidate_step;
480 0           $$bounds_2[3] += $candidate_step;
481 0           $$attributes_2{bounds} = $bounds_2;
482 0           $$attributes_2{y} += $candidate_step;
483              
484 0           $node_2 -> attributes($attributes_2);
485             }
486             }
487              
488 0           return 1; # Keep walking.
489             },
490 0           _depth => 0,
491             });
492              
493             } # End of _check_node_bounds.
494              
495             # ------------------------------------------------
496              
497             sub _check_for_overlap
498             {
499 0     0     my($self) = @_;
500              
501             $self -> root -> walk_down
502             ({
503             callback =>
504             sub
505             {
506 0     0     my($node) = @_;
507              
508 0           $self -> _check_node_bounds($node);
509              
510 0           return 1; # Keep walking.
511             },
512 0           _depth => 0,
513             });
514              
515             } # End of _check_for_overlap.
516              
517             # ------------------------------------------------
518              
519             sub draw_image
520             {
521 0     0 0   my($self) = @_;
522 0           my($final_x_step) = $self -> final_x_step;
523 0           my($maximum_x) = $self -> maximum_x + $self -> left_margin;
524 0           my($maximum_y) = $self -> maximum_y + $self -> top_margin;
525 0           my($image) = $self -> create_image($maximum_x, $maximum_y);
526 0           my($x_step) = $self -> x_step;
527              
528 0 0         if ($self -> title_width > $maximum_x)
529             {
530 0           $maximum_x = $self -> title_width + $self -> left_margin;
531 0           $image = $self -> create_image($maximum_x, $maximum_y);
532              
533 0           $self -> maximum_x($maximum_x);
534             }
535              
536 0           my($attributes);
537 0           my(@daughters, @daughter_attributes, $daughter_attributes);
538 0           my(@final_daughters, $final_offset);
539 0           my($index);
540 0           my($middle_attributes);
541 0           my($name);
542 0           my($place, %place);
543              
544             $self -> root -> walk_down
545             ({
546             callback =>
547             sub
548             {
549 0     0     my($node) = @_;
550 0           $attributes = $node -> attributes;
551 0           @daughters = $node -> daughters;
552 0           %place = ();
553              
554 0           for (0 .. $#daughters)
555             {
556 0           $daughter_attributes[$_] = $daughters[$_] -> attributes;
557 0           $place = $daughter_attributes[$_]{place};
558 0           $place{$place} = $_;
559 0 0         $middle_attributes = $daughter_attributes[$_] if ($place eq 'middle');
560             }
561              
562             # Connect above and below daughters to middle daughter.
563              
564 0           for $place (keys %place)
565             {
566 0           $index = $place{$place};
567 0           $name = $daughters[$index] -> name;
568 0           $daughter_attributes = $daughter_attributes[$index];
569              
570 0           $self -> draw_vertical_branch($image, $middle_attributes, $daughter_attributes);
571              
572 0 0 0       if ( ($node -> name ne $name) && ($name ne 'root') )
573             {
574             # Stretch the horizontal lines, but only for leaves.
575              
576 0           @final_daughters = $daughters[$index] -> daughters;
577 0 0         $final_offset = $#final_daughters < 0 ? $final_x_step : 0;
578              
579 0           $self -> draw_horizontal_branch($image, $middle_attributes, $daughter_attributes, $final_offset);
580 0           $self -> draw_leaf_name($image, $name, $daughter_attributes, $final_offset);
581              
582             }
583             }
584              
585 0           return 1; # Keep walking.
586             },
587 0           _depth => 0,
588             });
589              
590             # Draw a line off to the left of the middle daughter of the root.
591              
592 0           $self -> draw_root_branch($image);
593 0           $self -> draw_title($image, $maximum_x, $maximum_y);
594              
595 0           my($output_file) = $self -> output_file;
596              
597 0 0         $self -> write($image, $output_file) if (length($output_file) );
598              
599             } # End of draw_image.
600              
601             # ------------------------------------------------
602              
603             sub find_maximum_x
604             {
605 0     0 0   my($self) = @_;
606 0           my($maximum_x) = 0;
607              
608 0           my($attributes);
609             my($bounds);
610              
611             $self -> root -> walk_down
612             ({
613             callback =>
614             sub
615             {
616 0     0     my($node) = @_;
617 0           $attributes = $node -> attributes;
618 0           $bounds = $$attributes{bounds};
619 0 0         $maximum_x = $$bounds[2] if ($$bounds[2] > $maximum_x);
620              
621 0           return 1; # Keep walking.
622             },
623 0           _depth => 0,
624             });
625              
626 0           $maximum_x += $self -> final_x_step;
627 0 0         $maximum_x = $self -> title_width if ($self -> title_width > $maximum_x);
628              
629 0           $self -> maximum_x($maximum_x);
630              
631             } # End of find_maximum_x.
632              
633             # ------------------------------------------------
634              
635             sub find_maximum_y
636             {
637 0     0 0   my($self) = @_;
638 0           my($maximum_y) = 0;
639              
640 0           my($attributes);
641             my($bounds);
642              
643             $self -> root -> walk_down
644             ({
645             callback =>
646             sub
647             {
648 0     0     my($node) = @_;
649 0           $attributes = $node -> attributes;
650 0           $bounds = $$attributes{bounds};
651 0 0         $maximum_y = $$bounds[3] if ($$bounds[3] > $maximum_y);
652              
653 0           return 1; # Keep walking.
654             },
655 0           _depth => 0,
656             });
657              
658 0           $self -> maximum_y($maximum_y + 2 * $self -> title_font_size);
659              
660             } # End of find_maximum_y.
661              
662             # ------------------------------------------------
663              
664             sub find_minimum_y
665             {
666 0     0 0   my($self) = @_;
667 0           my($minimum_y) = 0;
668              
669 0           my($attributes);
670              
671             $self -> root -> walk_down
672             ({
673             callback =>
674             sub
675             {
676 0     0     my($node) = @_;
677 0           $attributes = $node -> attributes;
678 0 0         $minimum_y = $$attributes{y} if ($$attributes{y} < $minimum_y);
679              
680 0           return 1; # Keep walking.
681             },
682 0           _depth => 0,
683             });
684              
685 0           $self -> minimum_y($minimum_y);
686              
687             } # End of find_minimum_y.
688              
689             # ------------------------------------------------
690              
691             sub log
692             {
693 0     0 0   my($self, $message) = @_;
694              
695 0           print "$message\n";
696              
697             } # End of log.
698              
699             # ------------------------------------------------
700              
701             sub move_away_from_frame
702             {
703 0     0 0   my($self) = @_;
704 0           my($minimum_y) = $self -> minimum_y;
705 0           my($top_margin) = $self -> top_margin;
706 0           my($x_offset) = $self -> left_margin;
707 0 0         my($y_offset) = $minimum_y <= 0
    0          
708             ? $top_margin - $minimum_y
709             : $minimum_y < $top_margin
710             ? $top_margin - $minimum_y
711             : - $minimum_y + $top_margin;
712              
713 0           my($attributes);
714              
715             $self -> root -> walk_down
716             ({
717             callback =>
718             sub
719             {
720 0     0     my($node) = @_;
721 0           $attributes = $node -> attributes;
722 0           $$attributes{x} += $x_offset;
723 0           $$attributes{y} += $y_offset;
724              
725 0           return 1; # Keep walking.
726             },
727 0           _depth => 0,
728             });
729              
730 0           $self -> minimum_y($minimum_y);
731              
732             } # End of move_away_from_frame.
733              
734             # ------------------------------------------------
735              
736             sub new_node
737             {
738 0     0 0   my($self, $name, $attributes) = @_;
739 0           $$attributes{bounds} = [];
740 0           $$attributes{uid} = $self -> uid($self -> uid + 1);
741              
742 0           return Tree::DAG_Node -> new({name => $name, attributes => $attributes});
743              
744             } # End of new_node.
745              
746             # ------------------------------------------------
747              
748             sub read
749             {
750 0     0 0   my($self) = @_;
751 0           my($count) = 0;
752 0           my($parent) = $self -> root;
753              
754 0           my(%cache);
755             my(@field);
756 0           my($node);
757 0           my(%seen);
758              
759 0           for my $line (read_lines($self -> input_file) )
760             {
761 0           $line =~ s/^\s+//;
762 0           $line =~ s/\s+$//;
763              
764 0 0 0       next if ( (length($line) == 0) || ($line =~ /^\s*#/) );
765              
766 0           $count++;
767              
768             # Format expected (see data/wikipedia.01.clad):
769             #
770             # Parent Place Node
771             # Root above Beetles
772             # Root below 1
773             # 1 above Wasps, bees, ants
774             # 1 below 2
775             # 2 above Butterflies, moths
776             # 2 below Flies
777              
778 0           @field = split(/\s+/, $line, 3);
779 0           $field[$_] = lc $field[$_] for (0 .. 1);
780              
781 0 0         if ($count == 1)
782             {
783 0           $field[2] = lc $field[2];
784              
785 0 0 0       if ( ($field[0] ne 'parent') || ($field[1] ne 'place') || ($field[2] ne 'node') )
      0        
786             {
787 0           die "Error. Input file line $count is in the wrong format. It must be 'Parent Place Node'\n";
788             }
789              
790 0           next;
791             }
792              
793 0 0         if ($#field <= 1)
794             {
795 0           die "Error. Input file line $count does not have enough columns\n";
796             }
797              
798             # Count the # of times each node appears. This serves several purposes.
799              
800 0 0         $seen{$field[0]} = 0 if (! defined $seen{$field[0]});
801 0           $seen{$field[0]}++;
802              
803 0 0         if ($seen{$field[0]} > 2)
    0          
804             {
805 0           die "Error. Input file line $count has $seen{$field[0]} copies of $field[0], but the maximum must be 2\n";
806             }
807             elsif ($field[1] !~ /above|below/)
808             {
809 0           die "Error. Input file line $count has a unknown place: '$field[1]'. It must be 'above' or 'below'\n";
810             }
811              
812             # The first time each node appears, give its parent a middle daughter.
813             # Note: The node called 'root' is not cached.
814              
815 0 0         if ($seen{$field[0]} == 1)
816             {
817 0           $node = $self -> new_node($field[0], {place => 'middle'});
818              
819 0 0         if ($cache{$field[0]})
820             {
821 0           $parent = $cache{$field[0]};
822              
823 0           $parent -> add_daughter($node);
824             }
825             else
826             {
827 0           $parent -> add_daughter($node);
828             }
829             }
830              
831             # Now give the middle daughter its above and below sisters, one each time thru the loop.
832              
833 0           $cache{$field[2]} = $self -> new_node($field[2], {place => $field[1]});
834              
835 0           $parent -> add_daughter($cache{$field[2]});
836             }
837              
838             } # End of read.
839              
840             # ------------------------------------------------
841              
842             sub run
843             {
844 0     0 1   my($self) = @_;
845              
846 0           $self -> read;
847 0           $self -> _calculate_basic_attributes;
848 0           $self -> find_minimum_y;
849 0 0         $self -> move_away_from_frame if ($self -> minimum_y <= $self -> top_margin);
850 0           $self -> _calculate_leaf_name_bounds;
851 0           $self -> _check_for_overlap;
852 0           $self -> find_maximum_x;
853 0           $self -> find_maximum_y;
854 0           $self -> _calculate_minimum_sister_separation;
855 0           $self -> draw_image;
856              
857 0 0         $self -> log(join('', map("$_\n", @{$self -> root -> tree2string}) ) ) if ($self -> print_tree);
  0            
858              
859             # Return 0 for success and 1 for failure.
860              
861 0           return 0;
862              
863             } # End of run.
864              
865             # ------------------------------------------------
866              
867             1;
868              
869             =pod
870              
871             =head1 NAME
872              
873             C - Render a cladogram using Imager or Image::Magick
874              
875             =head1 Synopsis
876              
877             This is scripts/imager.pl:
878              
879             #!/usr/bin/env perl
880              
881             use strict;
882             use warnings;
883              
884             use Getopt::Long;
885              
886             use Pod::Usage;
887              
888             use Tree::Cladogram::Imager; # Or Tree::Cladogram::ImageMagick.
889              
890             # ----------------------------------------------
891              
892             my($option_parser) = Getopt::Long::Parser -> new;
893              
894             my(%option);
895              
896             if ($option_parser -> getoptions
897             (
898             \%option,
899             'draw_frame=i',
900             'frame_color=s',
901             'help',
902             'input_file=s',
903             'leaf_font_file=s',
904             'leaf_font_size=i',
905             'output_file=s',
906             'print_tree=i',
907             'title=s',
908             'title_font_file=s',
909             'title_font_size=s',
910             ) )
911             {
912             pod2usage(1) if ($option{'help'});
913              
914             exit Tree::Cladogram::Imager -> new(%option) -> run;
915             }
916             else
917             {
918             pod2usage(2);
919             }
920              
921             See also scripts/image.magick.pl.
922              
923             As you can see, you create an object and then call L.
924              
925             And this is the heart of scripts/imager.sh:
926              
927             perl -Ilib scripts/plot.pl \
928             -debug 0 \
929             -draw_frame $FRAME \
930             -input_file data/$i.01.clad \
931             -leaf_font_file $LEAF_FONT_FILE \
932             -output_file data/$i.01.png \
933             -title "$TITLE" \
934             -title_font_file $TITLE_FONT_FILE
935              
936             See also scripts/image.magick.sh.
937              
938             =head1 Description
939              
940             C provides a mechanism to turn a tree into a cladogram image.
941             The image is generated using L or L.
942              
943             The image type created is determined by the suffix of the output file. See
944             L for details.
945              
946             The details of the cladogram are read from a text file. See the L for details.
947              
948             For information about cladograms, see L.
949              
950             For another sample of a cladogram, see
951             L.
952              
953             Sample input is shipped as data/*.clad.
954             The corresponding output is shipped as data/*.png, and is on-line:
955              
956             L
957              
958             L
959              
960             L
961              
962             L
963              
964             =head1 Distributions
965              
966             This module is available as a Unix-style distro (*.tgz).
967              
968             See L
969             for help on unpacking and installing distros.
970              
971             =head1 Installation
972              
973             Install L as you would for any C module:
974              
975             Run:
976              
977             cpanm Tree::Cladogram
978              
979             or run:
980              
981             sudo cpan Tree::Cladogram
982              
983             or unpack the distro, and then:
984              
985             perl Makefile.PL
986             make (or dmake or nmake)
987             make test
988             make install
989              
990             =head1 Constructor and Initialization
991              
992             C is called as
993             C<< my($cladotron) = Tree::Cladogram::Imager -> new(k1 => v1, k2 => v2, ...) >> or as
994             C<< my($cladotron) = Tree::Cladogram::ImageMagick -> new(k1 => v1, k2 => v2, ...) >>.
995              
996             It returns a new object of type C or C.
997              
998             Key-value pairs accepted in the parameter list (see corresponding methods for details
999             [e.g. L]):
1000              
1001             =over 4
1002              
1003             =item o branch_color => $string
1004              
1005             Specify the color of the branches in the tree.
1006              
1007             See (in the FAQ) L for details about colors.
1008              
1009             Default: '#7e7e7e' (gray).
1010              
1011             =item o branch_width => $integer
1012              
1013             Specify the thickness of the branches.
1014              
1015             Default: 3 (px).
1016              
1017             =item o debug => $Boolean
1018              
1019             Specify non-production effects.
1020              
1021             Currently, the only extra effect is to draw fuchsia boxes around the leaf names.
1022              
1023             Frankly, this helped me debug the L side of things.
1024              
1025             Default: 0 (no extra effects).
1026              
1027             =item o draw_frame => $Boolean
1028              
1029             Specify that you want a frame around the image.
1030              
1031             Default: 0 (no frame).
1032              
1033             =item o final_x_step => $integer
1034              
1035             Specify an extra bit for the length of the final branch leading to the names of the leaves.
1036              
1037             Default: 30 (px).
1038              
1039             =item o frame_color => $string
1040              
1041             Specify the color of the frame, if any.
1042              
1043             See also C.
1044              
1045             Default: '#0000ff' (blue).
1046              
1047             =item o input_file => $string
1048              
1049             Specify the name of the *.clad file to read. Of course, the suffix does not have to be 'clad'.
1050              
1051             The format of this file is specified in the L.
1052              
1053             Default: ''.
1054              
1055             =item o leaf_font_color => $string
1056              
1057             Specify the font color of the name of each leaf.
1058              
1059             Default: '#0000ff' (blue).
1060              
1061             =item o leaf_font_file => $string
1062              
1063             Specify the name of the font file to use for the names of the leaves.
1064              
1065             You can use path names, as per the default, or - using Image::Magick -, you can just use the name
1066             of the font, such as 'DejaVu-Sans-ExtraLight'.
1067              
1068             Default: '/usr/share/fonts/truetype/freefont/FreeMono.ttf'.
1069              
1070             =item o leaf_font_size => $integer
1071              
1072             Specify the size of the text used for the name of each leaf.
1073              
1074             Default: 16 (points).
1075              
1076             =item o left_margin => $integer
1077              
1078             Specify the distance from the left of the image to the left-most point at which something is drawn.
1079              
1080             This also sets the right-hand margin.
1081              
1082             Default: 15 (px).
1083              
1084             =item o output_file => $string
1085              
1086             Specify the name of the image file to write.
1087              
1088             Image formats supported are anything supported by L or L.
1089             See the L for details.
1090              
1091             Default: '' (no output).
1092              
1093             =item o print_tree => $Boolean
1094              
1095             Specify that you want to print the tree constructed by the code.
1096              
1097             This option is really a debugging aid.
1098              
1099             Default: 0 (no tree).
1100              
1101             =item o title => $string
1102              
1103             Specify the title to draw at the bottom of the image.
1104              
1105             Default: '' (no title).
1106              
1107             =item o title_font_color => $string
1108              
1109             Specify the font color of the title.
1110              
1111             Default: '#000000' (black).
1112              
1113             =item o title_font_file => $string
1114              
1115             Specify the name of the font file to use for the title.
1116              
1117             You can use path names, as per the default, or - using Image::Magick -, you can just use the name
1118             of the font, such as 'DejaVu-Sans-ExtraLight'.
1119              
1120             Default: '/usr/share/fonts/truetype/freefont/FreeSansBold.ttf'.
1121              
1122             =item o title_font_size => $integer
1123              
1124             Specify the size of the text used for the name of the title.
1125              
1126             Default: 16 (points).
1127              
1128             =item o top_margin => $integer
1129              
1130             Specify the distance from the top of the image to the top-most point at which something is drawn.
1131              
1132             This also sets the bottom margin.
1133              
1134             Default: 15 (px).
1135              
1136             =item o x_step => $integer
1137              
1138             The horizontal length of branches.
1139              
1140             See also L and L.
1141              
1142             Default: 50 (px).
1143              
1144             =item o y_step => $integer
1145              
1146             The vertical length of the branches.
1147              
1148             Note: Some vertical branches will be shortened if the code detects overlapping when leaf names are
1149             drawn.
1150              
1151             See also L.
1152              
1153             Default: 40 (px).
1154              
1155             =back
1156              
1157             =head1 Methods
1158              
1159             =head2 branch_color([$string])
1160              
1161             Get or set the color used to draw branches.
1162              
1163             See (in the FAQ) L for details about colors.
1164              
1165             C is a parameter to L.
1166              
1167             =head2 branch_width([$integer])
1168              
1169             Get or set the width of branches.
1170              
1171             C is a parameter to L.
1172              
1173             =head2 debug([$Boolean])
1174              
1175             Get or set the option to activate debug mode.
1176              
1177             C is a parameter to L.
1178              
1179             =head2 draw_frame([$Boolean])
1180              
1181             Get or set the option to draw a frame on the image.
1182              
1183             C is a parameter to L.
1184              
1185             =head2 final_x_step([$integer])
1186              
1187             Get or set a bit extra for the horizontal length of the branch leading to leaf names.
1188              
1189             C is a parameter to L.
1190              
1191             =head2 frame_color([$string])
1192              
1193             Get or set the color of the frame.
1194              
1195             C is a parameter to L.
1196              
1197             =head2 input_file([$string])
1198              
1199             Get or set the name of the input file.
1200              
1201             C is a parameter to L.
1202              
1203             =head2 leaf_font_color([$string])
1204              
1205             Get or set the font color of the text used to draw leaf names.
1206              
1207             C is a parameter to L.
1208              
1209             =head2 leaf_font_file([$string])
1210              
1211             Get or set the name of the font file used for leaf names.
1212              
1213             You can use path names, as per the default, or - using Image::Magick -, you can just use the name
1214             of the font, such as 'DejaVu-Sans-ExtraLight'.
1215              
1216             C is a parameter to L.
1217              
1218             =head2 leaf_font_size([$integer])
1219              
1220             Get or set the size of the font used to draw leaf names.
1221              
1222             C is a parameter to L.
1223              
1224             =head2 left_margin([$integer])
1225              
1226             Get or set the distance from the left edge at which drawing starts.
1227              
1228             This also sets the right margin.
1229              
1230             C is a parameter to L.
1231              
1232             =head2 maximum_x()
1233              
1234             Get the right-most point at which something was drawn.
1235              
1236             This value is determined by examining the bounding boxes of all leaf names.
1237              
1238             In the case that the title is wider that the right-most leaf's name, C reflects this
1239             fact.
1240              
1241             =head2 maximum_y()
1242              
1243             Get the bottom-most point at which something was drawn.
1244              
1245             This value includes the title, if any.
1246              
1247             =head2 new()
1248              
1249             See L for details on the parameters accepted by L.
1250              
1251             =head2 output_file([$string])
1252              
1253             Get or set the name of the output file.
1254              
1255             The file suffix determines what type of file is written.
1256              
1257             For more on supported image types, see the L.
1258              
1259             C is a parameter to L.
1260              
1261             =head2 print_tree([$Boolean])
1262              
1263             Get or set the option to print the tree constructed by the code. This is basically a debugging
1264             option.
1265              
1266             C is a parameter to L.
1267              
1268             =head2 root()
1269              
1270             Get the root of the tree built by calling run(). This tree is an object of type L.
1271              
1272             For printing the tree, see L.
1273              
1274             Normally, end-users would never call this method.
1275              
1276             =head2 run()
1277              
1278             After calling L, this is the only other method you would normally call.
1279              
1280             =head2 title([$string])
1281              
1282             Get or set the title to be drawn at the bottom of the image.
1283              
1284             Note: It's vital you set the title before calling L, since the width of the title might
1285             be greater that the width of the tree, and the width of the title would then be used to determine
1286             the width of the image to create.
1287              
1288             C is a parameter to L</new()>. </td> </tr> <tr> <td class="h" > <a name="1289">1289</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1290">1290</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 title_font_color([$string]) </td> </tr> <tr> <td class="h" > <a name="1291">1291</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1292">1292</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Get or set the font color of the text used to draw the title. </td> </tr> <tr> <td class="h" > <a name="1293">1293</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1294">1294</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<title_font_color> is a parameter to L</new()>. </td> </tr> <tr> <td class="h" > <a name="1295">1295</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1296">1296</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 title_font_file([$string]) </td> </tr> <tr> <td class="h" > <a name="1297">1297</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1298">1298</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Get or set the name of the font file used for the title. </td> </tr> <tr> <td class="h" > <a name="1299">1299</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1300">1300</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> You can use path names, as per the default, or - using Image::Magick -, you can just use the name </td> </tr> <tr> <td class="h" > <a name="1301">1301</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> of the font, such as 'DejaVu-Sans-ExtraLight'. </td> </tr> <tr> <td class="h" > <a name="1302">1302</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1303">1303</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<title_font_file> is a parameter to L</new()>. </td> </tr> <tr> <td class="h" > <a name="1304">1304</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1305">1305</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 title_font_size([$integer]) </td> </tr> <tr> <td class="h" > <a name="1306">1306</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1307">1307</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Get or set the size of the font used to draw the title. </td> </tr> <tr> <td class="h" > <a name="1308">1308</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1309">1309</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<title_font_size> is a parameter to L</new()>. </td> </tr> <tr> <td class="h" > <a name="1310">1310</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1311">1311</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 top_margin([$integer]) </td> </tr> <tr> <td class="h" > <a name="1312">1312</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1313">1313</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Get or set the distance from the top edge at which drawing starts. </td> </tr> <tr> <td class="h" > <a name="1314">1314</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1315">1315</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This also sets the bottom margin. </td> </tr> <tr> <td class="h" > <a name="1316">1316</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1317">1317</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<top_margin> is a parameter to L</new()>. </td> </tr> <tr> <td class="h" > <a name="1318">1318</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1319">1319</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 x_step([$integer]) </td> </tr> <tr> <td class="h" > <a name="1320">1320</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1321">1321</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Get or set the length of horizontal branches. </td> </tr> <tr> <td class="h" > <a name="1322">1322</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1323">1323</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> See also C<final_x_step>. </td> </tr> <tr> <td class="h" > <a name="1324">1324</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1325">1325</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<x_step> is a parameter to L</new()>. </td> </tr> <tr> <td class="h" > <a name="1326">1326</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1327">1327</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 y_step([$integer]) </td> </tr> <tr> <td class="h" > <a name="1328">1328</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1329">1329</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Get or set the length of vertical branches. </td> </tr> <tr> <td class="h" > <a name="1330">1330</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1331">1331</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Note: Some vertical branches will be shortened if the code detects overlapping when leaf names are </td> </tr> <tr> <td class="h" > <a name="1332">1332</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> drawn. </td> </tr> <tr> <td class="h" > <a name="1333">1333</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1334">1334</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<y_step> is a parameter to L</new()>. </td> </tr> <tr> <td class="h" > <a name="1335">1335</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1336">1336</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 Scripts and data files shipped with this module </td> </tr> <tr> <td class="h" > <a name="1337">1337</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1338">1338</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Scripts </td> </tr> <tr> <td class="h" > <a name="1339">1339</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1340">1340</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> See scripts/*.pl and scripts/*.sh. </td> </tr> <tr> <td class="h" > <a name="1341">1341</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1342">1342</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over 4 </td> </tr> <tr> <td class="h" > <a name="1343">1343</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1344">1344</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o Debian.font.list.pl </td> </tr> <tr> <td class="h" > <a name="1345">1345</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1346">1346</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Outputs to my web server's doc root, which is in Debian's RAM disk, a file called </td> </tr> <tr> <td class="h" > <a name="1347">1347</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "$ENV{DR}/misc/Debian.font.list.png". </td> </tr> <tr> <td class="h" > <a name="1348">1348</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1349">1349</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The output file is not part of the distro (being 3.3 Mb), but is on line at </td> </tr> <tr> <td class="h" > <a name="1350">1350</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<http://savage.net.au/misc/Debian.font.list.png>. </td> </tr> <tr> <td class="h" > <a name="1351">1351</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1352">1352</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o image.magick.pl </td> </tr> <tr> <td class="h" > <a name="1353">1353</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1354">1354</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The program you would normally use to drive Tree::Cladogram::ImageMagick. </td> </tr> <tr> <td class="h" > <a name="1355">1355</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1356">1356</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> See also image.magick.sh. </td> </tr> <tr> <td class="h" > <a name="1357">1357</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1358">1358</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o image.magick.sh </td> </tr> <tr> <td class="h" > <a name="1359">1359</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1360">1360</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> A convenient way to run image.magick.pl. </td> </tr> <tr> <td class="h" > <a name="1361">1361</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1362">1362</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o imager.pl </td> </tr> <tr> <td class="h" > <a name="1363">1363</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1364">1364</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The program you would normally use to drive Tree::Cladogram::Imager. </td> </tr> <tr> <td class="h" > <a name="1365">1365</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1366">1366</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> See also imager.sh. </td> </tr> <tr> <td class="h" > <a name="1367">1367</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1368">1368</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o imager.sh </td> </tr> <tr> <td class="h" > <a name="1369">1369</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1370">1370</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> A convenient way to run imager.pl. </td> </tr> <tr> <td class="h" > <a name="1371">1371</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1372">1372</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o pod2html.sh </td> </tr> <tr> <td class="h" > <a name="1373">1373</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1374">1374</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> A simple way for me to convert the docs into HTML. </td> </tr> <tr> <td class="h" > <a name="1375">1375</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1376">1376</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o test.image.magick.pl </td> </tr> <tr> <td class="h" > <a name="1377">1377</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1378">1378</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Outputs data/test.image.magick.png. I used this program to experiment with L<Image::Magick> while </td> </tr> <tr> <td class="h" > <a name="1379">1379</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> converting Tree::Cladogram::Imager into Tree::Cladogram::ImageMagick. </td> </tr> <tr> <td class="h" > <a name="1380">1380</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1381">1381</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o test.image.magick.sh </td> </tr> <tr> <td class="h" > <a name="1382">1382</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1383">1383</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> A convenient way to run test.image.magick.pl. </td> </tr> <tr> <td class="h" > <a name="1384">1384</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1385">1385</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =back </td> </tr> <tr> <td class="h" > <a name="1386">1386</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1387">1387</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Data files </td> </tr> <tr> <td class="h" > <a name="1388">1388</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1389">1389</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> See data/*. </td> </tr> <tr> <td class="h" > <a name="1390">1390</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1391">1391</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over 4 </td> </tr> <tr> <td class="h" > <a name="1392">1392</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1393">1393</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o nationalgeographic.01.clad </td> </tr> <tr> <td class="h" > <a name="1394">1394</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1395">1395</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This sample input file is discussed just below, at the start of the L</FAQ>. </td> </tr> <tr> <td class="h" > <a name="1396">1396</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1397">1397</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o nationalgeographic.01.png </td> </tr> <tr> <td class="h" > <a name="1398">1398</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1399">1399</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This is the output of rendering nationalgeographic.01.clad with L<Imager>. </td> </tr> <tr> <td class="h" > <a name="1400">1400</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1401">1401</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o nationalgeographic.02.png </td> </tr> <tr> <td class="h" > <a name="1402">1402</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1403">1403</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This is the output of rendering nationalgeographic.01.clad with L<Image::Magick>. </td> </tr> <tr> <td class="h" > <a name="1404">1404</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1405">1405</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o test.image.magick.png </td> </tr> <tr> <td class="h" > <a name="1406">1406</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1407">1407</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The is is output of scripts/test.image.magick.pl. </td> </tr> <tr> <td class="h" > <a name="1408">1408</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1409">1409</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o wikipedia.01.clad </td> </tr> <tr> <td class="h" > <a name="1410">1410</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1411">1411</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This sample input file is discussed just below, at the start of the L</FAQ>. </td> </tr> <tr> <td class="h" > <a name="1412">1412</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1413">1413</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o wikipedia.01.png </td> </tr> <tr> <td class="h" > <a name="1414">1414</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1415">1415</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This is the output of rendering wikipedia.01.clad with L<Imager>. </td> </tr> <tr> <td class="h" > <a name="1416">1416</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1417">1417</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o wikipedia.02.png </td> </tr> <tr> <td class="h" > <a name="1418">1418</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1419">1419</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This is the output of rendering wikipedia.01.clad with L<Image::Magick>. </td> </tr> <tr> <td class="h" > <a name="1420">1420</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1421">1421</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =back </td> </tr> <tr> <td class="h" > <a name="1422">1422</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1423">1423</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 FAQ </td> </tr> <tr> <td class="h" > <a name="1424">1424</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1425">1425</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 What is the format of the input file? </td> </tr> <tr> <td class="h" > <a name="1426">1426</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1427">1427</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Sample 1 - L<https://en.wikipedia.org/wiki/Cladogram>: </td> </tr> <tr> <td class="h" > <a name="1428">1428</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1429">1429</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> +---- Beetles </td> </tr> <tr> <td class="h" > <a name="1430">1430</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | </td> </tr> <tr> <td class="h" > <a name="1431">1431</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | </td> </tr> <tr> <td class="h" > <a name="1432">1432</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Root ---+ +---- Wasps, bees, ants </td> </tr> <tr> <td class="h" > <a name="1433">1433</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1434">1434</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1435">1435</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1---+ +---- Butterflies, moths </td> </tr> <tr> <td class="h" > <a name="1436">1436</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1437">1437</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1438">1438</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 2---+ </td> </tr> <tr> <td class="h" > <a name="1439">1439</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | </td> </tr> <tr> <td class="h" > <a name="1440">1440</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | </td> </tr> <tr> <td class="h" > <a name="1441">1441</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> +---- Flies </td> </tr> <tr> <td class="h" > <a name="1442">1442</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1443">1443</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This is the data file (shipped as data/cladogram.01.clad). The format is defined formally below: </td> </tr> <tr> <td class="h" > <a name="1444">1444</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1445">1445</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Parent Place Node </td> </tr> <tr> <td class="h" > <a name="1446">1446</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> root above Beetles </td> </tr> <tr> <td class="h" > <a name="1447">1447</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> root below 1 </td> </tr> <tr> <td class="h" > <a name="1448">1448</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1 above Wasps, bees, ants </td> </tr> <tr> <td class="h" > <a name="1449">1449</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1 below 2 </td> </tr> <tr> <td class="h" > <a name="1450">1450</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 2 above Butterflies, moths </td> </tr> <tr> <td class="h" > <a name="1451">1451</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 2 below Flies </td> </tr> <tr> <td class="h" > <a name="1452">1452</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1453">1453</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Output: L<Using Imager|http://savage.net.au/misc/wikipedia.01.png> and </td> </tr> <tr> <td class="h" > <a name="1454">1454</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<using Image::Magick|http://savage.net.au/misc/wikipedia.02.png>. </td> </tr> <tr> <td class="h" > <a name="1455">1455</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1456">1456</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Sample 2 - L<http://phenomena.nationalgeographic.com/2015/12/11/paleo-profile-the-smoke-hill-bird/>: </td> </tr> <tr> <td class="h" > <a name="1457">1457</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1458">1458</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> +--- Archaeopterix lithographica </td> </tr> <tr> <td class="h" > <a name="1459">1459</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | </td> </tr> <tr> <td class="h" > <a name="1460">1460</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | </td> </tr> <tr> <td class="h" > <a name="1461">1461</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | </td> </tr> <tr> <td class="h" > <a name="1462">1462</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Root ---+ +--- Apsaravis ukhaana </td> </tr> <tr> <td class="h" > <a name="1463">1463</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1464">1464</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1465">1465</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1466">1466</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1---+ +--- Gansus yumemensis </td> </tr> <tr> <td class="h" > <a name="1467">1467</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1468">1468</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1469">1469</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1470">1470</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 2---+ +--- Ichthyornis dispar </td> </tr> <tr> <td class="h" > <a name="1471">1471</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1472">1472</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | +--- Gallus gallus </td> </tr> <tr> <td class="h" > <a name="1473">1473</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | | </td> </tr> <tr> <td class="h" > <a name="1474">1474</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 3---+ 5---+ </td> </tr> <tr> <td class="h" > <a name="1475">1475</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | | </td> </tr> <tr> <td class="h" > <a name="1476">1476</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | +--- Anas clypeata </td> </tr> <tr> <td class="h" > <a name="1477">1477</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1478">1478</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 4---+ </td> </tr> <tr> <td class="h" > <a name="1479">1479</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | +--- Pasquiaornis </td> </tr> <tr> <td class="h" > <a name="1480">1480</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1481">1481</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1482">1482</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 6---+ +--- Enaliornis </td> </tr> <tr> <td class="h" > <a name="1483">1483</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1484">1484</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1485">1485</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1486">1486</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 7---+ +--- Baptornis advenus </td> </tr> <tr> <td class="h" > <a name="1487">1487</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1488">1488</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | +--- Brodavis varnei </td> </tr> <tr> <td class="h" > <a name="1489">1489</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | | </td> </tr> <tr> <td class="h" > <a name="1490">1490</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 8---+ 10--+ </td> </tr> <tr> <td class="h" > <a name="1491">1491</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | | </td> </tr> <tr> <td class="h" > <a name="1492">1492</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | +--- Brodavis baileyi </td> </tr> <tr> <td class="h" > <a name="1493">1493</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1494">1494</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 9---+ </td> </tr> <tr> <td class="h" > <a name="1495">1495</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | +--- Fumicollis hoffmani </td> </tr> <tr> <td class="h" > <a name="1496">1496</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1497">1497</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1498">1498</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 11--+ +--- Parahesperornis alexi </td> </tr> <tr> <td class="h" > <a name="1499">1499</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1500">1500</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | | </td> </tr> <tr> <td class="h" > <a name="1501">1501</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 12--+ </td> </tr> <tr> <td class="h" > <a name="1502">1502</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | </td> </tr> <tr> <td class="h" > <a name="1503">1503</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> | </td> </tr> <tr> <td class="h" > <a name="1504">1504</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> +--- Hesperornis regalis </td> </tr> <tr> <td class="h" > <a name="1505">1505</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1506">1506</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This is the data file (shipped as data/nationalgeographic.01.clad). The format is defined formally </td> </tr> <tr> <td class="h" > <a name="1507">1507</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> below: </td> </tr> <tr> <td class="h" > <a name="1508">1508</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1509">1509</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Parent Place Node </td> </tr> <tr> <td class="h" > <a name="1510">1510</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> root above Archaeopterix lithographica </td> </tr> <tr> <td class="h" > <a name="1511">1511</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> root below 1 </td> </tr> <tr> <td class="h" > <a name="1512">1512</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1 above Apsaravis ukhaana </td> </tr> <tr> <td class="h" > <a name="1513">1513</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1 below 2 </td> </tr> <tr> <td class="h" > <a name="1514">1514</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 2 above Gansus yumemensis </td> </tr> <tr> <td class="h" > <a name="1515">1515</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 2 below 3 </td> </tr> <tr> <td class="h" > <a name="1516">1516</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 3 above Ichthyornis dispar </td> </tr> <tr> <td class="h" > <a name="1517">1517</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 3 below 4 </td> </tr> <tr> <td class="h" > <a name="1518">1518</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 4 above 5 </td> </tr> <tr> <td class="h" > <a name="1519">1519</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 4 below 6 </td> </tr> <tr> <td class="h" > <a name="1520">1520</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 5 above Gallus gallus </td> </tr> <tr> <td class="h" > <a name="1521">1521</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 5 below Anas clypeata </td> </tr> <tr> <td class="h" > <a name="1522">1522</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 6 above Pasquiaornis </td> </tr> <tr> <td class="h" > <a name="1523">1523</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 6 below 7 </td> </tr> <tr> <td class="h" > <a name="1524">1524</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 7 above Enaliornis </td> </tr> <tr> <td class="h" > <a name="1525">1525</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 7 below 8 </td> </tr> <tr> <td class="h" > <a name="1526">1526</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 8 above Baptornis advenus </td> </tr> <tr> <td class="h" > <a name="1527">1527</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 8 below 9 </td> </tr> <tr> <td class="h" > <a name="1528">1528</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 9 above 10 </td> </tr> <tr> <td class="h" > <a name="1529">1529</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 9 below 11 </td> </tr> <tr> <td class="h" > <a name="1530">1530</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 10 above Brodavis varnei </td> </tr> <tr> <td class="h" > <a name="1531">1531</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 10 below Brodavis baileyi </td> </tr> <tr> <td class="h" > <a name="1532">1532</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 11 above Fumicollis hoffmani </td> </tr> <tr> <td class="h" > <a name="1533">1533</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 11 below 12 </td> </tr> <tr> <td class="h" > <a name="1534">1534</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 12 above Parahesperornis alexi </td> </tr> <tr> <td class="h" > <a name="1535">1535</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 12 below Hesperornis regalis </td> </tr> <tr> <td class="h" > <a name="1536">1536</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1537">1537</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Output: L<Using Imager|http://savage.net.au/misc/nationalgeographic.01.png> and </td> </tr> <tr> <td class="h" > <a name="1538">1538</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<using Image::Magick|http://savage.net.au/misc/nationalgeographic.02.png>. </td> </tr> <tr> <td class="h" > <a name="1539">1539</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1540">1540</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> File format: </td> </tr> <tr> <td class="h" > <a name="1541">1541</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1542">1542</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over 4 </td> </tr> <tr> <td class="h" > <a name="1543">1543</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1544">1544</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o Words and numbers on each line are tab separated </td> </tr> <tr> <td class="h" > <a name="1545">1545</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1546">1546</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Oh, all right. You can use any number of spaces too, but why bother? </td> </tr> <tr> <td class="h" > <a name="1547">1547</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1548">1548</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o There are 3 columns </td> </tr> <tr> <td class="h" > <a name="1549">1549</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1550">1550</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over 4 </td> </tr> <tr> <td class="h" > <a name="1551">1551</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1552">1552</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o The first line must match /Parent\tPlace\tNode/i </td> </tr> <tr> <td class="h" > <a name="1553">1553</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1554">1554</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> For non-programmers, the /.../ is a regular expression, just saying the program tests for that </td> </tr> <tr> <td class="h" > <a name="1555">1555</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> exact string. The '\t's represent tabs and the suffix 'i' means use a case-insensitive test. </td> </tr> <tr> <td class="h" > <a name="1556">1556</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1557">1557</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o Thereafter, column 1 is the name of the node </td> </tr> <tr> <td class="h" > <a name="1558">1558</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1559">1559</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o The word 'root' is (also) case-insensitive </td> </tr> <tr> <td class="h" > <a name="1560">1560</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1561">1561</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o Every node has 2 mandatory lines </td> </tr> <tr> <td class="h" > <a name="1562">1562</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1563">1563</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> One for the daughter 'above' the current node, and one for the daughter 'below'. </td> </tr> <tr> <td class="h" > <a name="1564">1564</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1565">1565</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o Column 2 specifies where the daughter appears in relation to the node </td> </tr> <tr> <td class="h" > <a name="1566">1566</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1567">1567</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o All words after the 2nd column are the name of that daughter </td> </tr> <tr> <td class="h" > <a name="1568">1568</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1569">1569</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =back </td> </tr> <tr> <td class="h" > <a name="1570">1570</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1571">1571</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o Fabricate skeleton nodes to hold together the nodes you are interested in </td> </tr> <tr> <td class="h" > <a name="1572">1572</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1573">1573</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o Use digits for the skeleton nodes' names </td> </tr> <tr> <td class="h" > <a name="1574">1574</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1575">1575</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The code hides the name of nodes which match /^(\d+|root)$/. </td> </tr> <tr> <td class="h" > <a name="1576">1576</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1577">1577</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =back </td> </tr> <tr> <td class="h" > <a name="1578">1578</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1579">1579</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Which versions of the renderers did you use? </td> </tr> <tr> <td class="h" > <a name="1580">1580</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1581">1581</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<Imager> V 1.004. </td> </tr> <tr> <td class="h" > <a name="1582">1582</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1583">1583</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<Image::Magick> V 6.9.3-0 Q16. </td> </tr> <tr> <td class="h" > <a name="1584">1584</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1585">1585</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> For help installing Image::Magick under Debian, see </td> </tr> <tr> <td class="h" > <a name="1586">1586</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<http://savage.net.au/ImageMagick/html/Installation.html>. </td> </tr> <tr> <td class="h" > <a name="1587">1587</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1588">1588</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 What image formats are supported? </td> </tr> <tr> <td class="h" > <a name="1589">1589</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1590">1590</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> My default install of L<Imager> lists: </td> </tr> <tr> <td class="h" > <a name="1591">1591</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1592">1592</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> bmp </td> </tr> <tr> <td class="h" > <a name="1593">1593</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> ft2 </td> </tr> <tr> <td class="h" > <a name="1594">1594</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> ifs </td> </tr> <tr> <td class="h" > <a name="1595">1595</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> png </td> </tr> <tr> <td class="h" > <a name="1596">1596</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> pnm </td> </tr> <tr> <td class="h" > <a name="1597">1597</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> raw </td> </tr> <tr> <td class="h" > <a name="1598">1598</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1599">1599</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<Image::Magick> supports a huge range of formats (221 actually). To list them, run </td> </tr> <tr> <td class="h" > <a name="1600">1600</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> scripts/test.image.magick.pl. Note: This program writes to data/test.image.magick.png. </td> </tr> <tr> <td class="h" > <a name="1601">1601</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1602">1602</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 What colors are supported? </td> </tr> <tr> <td class="h" > <a name="1603">1603</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1604">1604</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> See L<Imager::Color> for Imager's docs on color. But you're probably better off using </td> </tr> <tr> <td class="h" > <a name="1605">1605</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<Image::Magick>'s table mentioned next, since my module only accepts colors. It does not allow </td> </tr> <tr> <td class="h" > <a name="1606">1606</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> you to provide an Imager::Color object as a parameter. </td> </tr> <tr> <td class="h" > <a name="1607">1607</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1608">1608</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> See L<Image::Magick colors|http://www.imagemagick.org/script/color.php> for a huge table of both </td> </tr> <tr> <td class="h" > <a name="1609">1609</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> names and hex values. </td> </tr> <tr> <td class="h" > <a name="1610">1610</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1611">1611</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 What fonts are supported? </td> </tr> <tr> <td class="h" > <a name="1612">1612</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1613">1613</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Check these directories: </td> </tr> <tr> <td class="h" > <a name="1614">1614</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1615">1615</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over </td> </tr> <tr> <td class="h" > <a name="1616">1616</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1617">1617</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o /usr/local/share/fonts </td> </tr> <tr> <td class="h" > <a name="1618">1618</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1619">1619</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o /usr/share/fonts </td> </tr> <tr> <td class="h" > <a name="1620">1620</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1621">1621</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =back </td> </tr> <tr> <td class="h" > <a name="1622">1622</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1623">1623</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> If you're using L<Debian|http://debian.org>, run C<fc-list> for a list of installed fonts. </td> </tr> <tr> <td class="h" > <a name="1624">1624</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1625">1625</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> More information on Debian's support for fonts can be found on Debian's </td> </tr> <tr> <td class="h" > <a name="1626">1626</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<wiki|https://wiki.debian.org/Fonts>. </td> </tr> <tr> <td class="h" > <a name="1627">1627</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1628">1628</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> See L<http://savage.net.au/misc/Debian.font.list.png> for the fonts on my laptop. </td> </tr> <tr> <td class="h" > <a name="1629">1629</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Note: This file is 3.3 Mb, so you may have to zoom it to 500% to make it readable. </td> </tr> <tr> <td class="h" > <a name="1630">1630</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1631">1631</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> See scripts/imager.sh and scripts/image.magick.sh for lists of fonts I have played with while </td> </tr> <tr> <td class="h" > <a name="1632">1632</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> developing this module. </td> </tr> <tr> <td class="h" > <a name="1633">1633</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1634">1634</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Further, note this text copied from the docs for L<Imager::Font>: </td> </tr> <tr> <td class="h" > <a name="1635">1635</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1636">1636</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This module handles creating Font objects used by Imager. The module also handles querying </td> </tr> <tr> <td class="h" > <a name="1637">1637</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> fonts for sizes and such. If both T1lib and FreeType were available at the time of compilation </td> </tr> <tr> <td class="h" > <a name="1638">1638</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> then Imager should be able to work with both TrueType fonts and t1 Postscript fonts. To check </td> </tr> <tr> <td class="h" > <a name="1639">1639</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> if Imager is t1 or TrueType capable you can use something like this: </td> </tr> <tr> <td class="h" > <a name="1640">1640</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1641">1641</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> use Imager; </td> </tr> <tr> <td class="h" > <a name="1642">1642</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1643">1643</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> print "Has truetype\n" if $Imager::formats{tt}; </td> </tr> <tr> <td class="h" > <a name="1644">1644</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> print "Has t1 postscript\n" if $Imager::formats{t1}; </td> </tr> <tr> <td class="h" > <a name="1645">1645</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> print "Has Win32 fonts\n" if $Imager::formats{w32}; </td> </tr> <tr> <td class="h" > <a name="1646">1646</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> print "Has Freetype2\n" if $Imager::formats{ft2}; </td> </tr> <tr> <td class="h" > <a name="1647">1647</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1648">1648</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> My default install of L<Imager> reports: </td> </tr> <tr> <td class="h" > <a name="1649">1649</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1650">1650</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Has Freetype2 </td> </tr> <tr> <td class="h" > <a name="1651">1651</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1652">1652</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 How does leaf_font_size interact with y_step? </td> </tr> <tr> <td class="h" > <a name="1653">1653</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1654">1654</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This might depend on the font, but here are some tests I ran with the one leaf font: </td> </tr> <tr> <td class="h" > <a name="1655">1655</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1656">1656</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over 4 </td> </tr> <tr> <td class="h" > <a name="1657">1657</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1658">1658</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o leaf_font_size 12 works with y_step values of 28 .. 40 </td> </tr> <tr> <td class="h" > <a name="1659">1659</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1660">1660</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o leaf_font_size 16 works with y_step values of 36 .. 44 </td> </tr> <tr> <td class="h" > <a name="1661">1661</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1662">1662</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o leaf_font_size 20 works with y_step values of 40 .. 48 </td> </tr> <tr> <td class="h" > <a name="1663">1663</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1664">1664</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o leaf_font_size 24 works with a y_step value of 48 </td> </tr> <tr> <td class="h" > <a name="1665">1665</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1666">1666</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o leaf_font_size 28 works with a y_step value of 54 </td> </tr> <tr> <td class="h" > <a name="1667">1667</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1668">1668</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o leaf_font_size 32 works with a y_step value of 54 </td> </tr> <tr> <td class="h" > <a name="1669">1669</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1670">1670</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o leaf_font_size 36 works with a y_step value of 72 </td> </tr> <tr> <td class="h" > <a name="1671">1671</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1672">1672</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item o leaf_font_size 40 works with a y_step value of 72 </td> </tr> <tr> <td class="h" > <a name="1673">1673</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1674">1674</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =back </td> </tr> <tr> <td class="h" > <a name="1675">1675</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1676">1676</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Why did you use Tree::DAG_Node and not something like Tree::Simple? </td> </tr> <tr> <td class="h" > <a name="1677">1677</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1678">1678</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> I started with L<Tree::Simple> precisely because it's simple, but found it awkward to use. </td> </tr> <tr> <td class="h" > <a name="1679">1679</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1680">1680</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> I did use Tree::Simple in L<HTML::Parser::Simple>. That module was deliberately kept simple, </td> </tr> <tr> <td class="h" > <a name="1681">1681</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> but before that, and since, I've always gone back to L<Tree::DAG_Node>. </td> </tr> <tr> <td class="h" > <a name="1682">1682</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1683">1683</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 How is overlap between leaves detected? </td> </tr> <tr> <td class="h" > <a name="1684">1684</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1685">1685</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The process starts by calling the undocumented method C<_check_for_overlap()>. </td> </tr> <tr> <td class="h" > <a name="1686">1686</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1687">1687</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 See Also </td> </tr> <tr> <td class="h" > <a name="1688">1688</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1689">1689</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<Bio::Tree::Draw::Cladogram> </td> </tr> <tr> <td class="h" > <a name="1690">1690</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1691">1691</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<Imager> </td> </tr> <tr> <td class="h" > <a name="1692">1692</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1693">1693</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<Image::Magick> </td> </tr> <tr> <td class="h" > <a name="1694">1694</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1695">1695</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<Help installing Image::Magick|http://savage.net.au/ImageMagick/html/Installation.html> </td> </tr> <tr> <td class="h" > <a name="1696">1696</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1697">1697</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<Tree::DAG_Node> </td> </tr> <tr> <td class="h" > <a name="1698">1698</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1699">1699</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 Machine-Readable Change Log </td> </tr> <tr> <td class="h" > <a name="1700">1700</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1701">1701</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The file Changes was converted into Changelog.ini by L<Module::Metadata::Changes>. </td> </tr> <tr> <td class="h" > <a name="1702">1702</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1703">1703</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 Version Numbers </td> </tr> <tr> <td class="h" > <a name="1704">1704</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1705">1705</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Version numbers < 1.00 represent development versions. From 1.00 up, they are production versions. </td> </tr> <tr> <td class="h" > <a name="1706">1706</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1707">1707</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 Repository </td> </tr> <tr> <td class="h" > <a name="1708">1708</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1709">1709</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<https://github.com/ronsavage/Tree-Cladogram> </td> </tr> <tr> <td class="h" > <a name="1710">1710</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1711">1711</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 Support </td> </tr> <tr> <td class="h" > <a name="1712">1712</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1713">1713</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Bugs should be reported via the CPAN bug tracker at </td> </tr> <tr> <td class="h" > <a name="1714">1714</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1715">1715</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<https://github.com/ronsavage/Tree-Cladogram/issues> </td> </tr> <tr> <td class="h" > <a name="1716">1716</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1717">1717</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 Author </td> </tr> <tr> <td class="h" > <a name="1718">1718</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1719">1719</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<Tree::Cladogram> was written by Ron Savage I<E<lt>ron@savage.net.auE<gt>> in 2015. </td> </tr> <tr> <td class="h" > <a name="1720">1720</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1721">1721</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> My homepage: L<http://savage.net.au/> </td> </tr> <tr> <td class="h" > <a name="1722">1722</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1723">1723</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 Copyright </td> </tr> <tr> <td class="h" > <a name="1724">1724</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1725">1725</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Australian copyright (c) 2015, Ron Savage. </td> </tr> <tr> <td class="h" > <a name="1726">1726</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1727">1727</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> All Programs of mine are 'OSI Certified Open Source Software'; </td> </tr> <tr> <td class="h" > <a name="1728">1728</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> you can redistribute them and/or modify them under the terms of </td> </tr> <tr> <td class="h" > <a name="1729">1729</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The Perl License, a copy of which is available at: </td> </tr> <tr> <td class="h" > <a name="1730">1730</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> http://dev.perl.org/licenses/ </td> </tr> <tr> <td class="h" > <a name="1731">1731</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="1732">1732</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> </table> </body> </html>