File Coverage

blib/lib/Acme/Letter.pm
Criterion Covered Total %
statement 9 163 5.5
branch 0 34 0.0
condition 0 3 0.0
subroutine 3 9 33.3
pod 2 4 50.0
total 14 213 6.5


line stmt bran cond sub pod time code
1             package Acme::Letter;
2              
3 1     1   25549 use 5.010001;
  1         4  
  1         39  
4 1     1   5 use strict;
  1         2  
  1         31  
5 1     1   5 use warnings;
  1         6  
  1         3544  
6              
7             require Exporter;
8              
9             our @ISA = qw(Exporter);
10              
11             # Items to export into callers namespace by default. Note: do not export
12             # names by default without a very good reason. Use EXPORT_OK instead.
13             # Do not simply export all your public functions/methods/constants.
14              
15             # This allows declaration use Acme::Letter ':all';
16             # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
17             # will save memory.
18             our %EXPORT_TAGS = ( 'all' => [ qw(
19            
20             ) ] );
21              
22             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
23              
24             our @EXPORT = qw(
25            
26             );
27              
28             our $VERSION = '0.01';
29              
30              
31             # TODO:Preloaded methods go here.
32             sub new {
33 0     0 0   my $package = shift;
34              
35 0           my %self = ();
36             #inital each letter
37 0           my $array_A = [['*','*','*','*','_','*', '*', '*', '*'],
38             ['*','*','*','/','*','\\','*','*','*'],
39             ['*','*','/','*','_','*','\\','*','*'],
40             ['*','/','*','_','_','_','*','\\','*'],
41             ['/','_','/','*','*','*','\\','_','\\']];
42 0           $self{"array_A"} = $array_A;
43 0           my $array_B = [['*','_','_','_','_','_','*'],
44             ['|','*','*','_','*','*','\\'],
45             ['|','*','|','_',')','_','/'],
46             ['|','*','|','_',')','*','\\'],
47             ['|','_','_','_','_','_','/']];
48 0           $self{"array_B"} = $array_B;
49 0           my $array_C = [['*','*','_','_','_','_','_','*'],
50             ['*','/','*','*','_','_','_','|'],
51             ['|','*','*','/','*','*','*','*'],
52             ['|','*','*','\\','_','_','_','*'],
53             ['*','\\','_','_','_','_','_','|']];
54 0           $self{"array_C"} = $array_C;
55 0           my $array_D = [['*','_','_','_','_','_','*','*'],
56             ['|','*','*','_','*','*','\\','*'],
57             ['|','*','|','*','\\','*','*','|'],
58             ['|','*','|','_','/','*','*','|'],
59             ['|','_','_','_','_','_','/','*']];
60 0           $self{"array_D"} = $array_D;
61              
62 0           my $array_E = [['*','_','_','_','_','_','*'],
63             ['|','*','*','_','_','_','|'],
64             ['|','*','|','_','_','*','*'],
65             ['|','*','|','_','_','_','*'],
66             ['|','_','_','_','_','_','|']];
67 0           $self{"array_E"} = $array_E;
68              
69 0           my $array_F = [['*','_','_','_','_','_','*'],
70             ['|','*','*','_','_','_','|'],
71             ['|','*','|','_','*','*','*'],
72             ['|','*','*','_','|','*','*'],
73             ['|','_','|','*','*','*','*']];
74 0           $self{"array_F"} = $array_F;
75              
76 0           my $array_G = [['*','*','_','_','_','_','_','*'],
77             ['*','/','*','*','_','_','_','|'],
78             ['|','*','*','/','*','_','_','*'],
79             ['|','*','*','\\','_','_','_','|'],
80             ['*','\\','_','_','_','_','_','|']];
81 0           $self{"array_G"} = $array_G;
82              
83 0           my $array_H = [['*','_','*','*','*','_','*'],
84             ['|','*','|','*','|','*','|'],
85             ['|','_','|','_','|','_','|'],
86             ['|','*','|','*','|','*','|'],
87             ['|','_','|','*','|','_','|']];
88 0           $self{"array_H"} = $array_H;
89 0           my $array_I = [['*','_','_','_','_','_','*'],
90             ['|','_','_','*','_','_','|'],
91             ['*','*','|','*','|','*','*'],
92             ['*','_','|','_','|','_','*'],
93             ['|','_','_','_','_','_','|']];
94 0           $self{"array_I"} = $array_I;
95            
96 0           my $array_J = [['*','_','_','_','_','_','*'],
97             ['|','_','_','*','_','_','|'],
98             ['*','*','|','*','|','*','*'],
99             ['*','_','|','_','|','*','*'],
100             ['*','\\','_','/','*','*','*']];
101 0           $self{"array_J"} = $array_J;
102              
103 0           my $array_K = [['*','_','*','*','*','_','*'],
104             ['|','*','|','*','/','*','/'],
105             ['|','*','|','/','*','/','*'],
106             ['|','*','|','\\','*','\\','*'],
107             ['|','_','|','*','\\','_','\\']];
108 0           $self{"array_K"} = $array_K;
109              
110 0           my $array_L = [['*','_','*','*','*','*','*'],
111             ['|','*','|','*','*','*','*'],
112             ['|','*','|','*','*','*','*'],
113             ['|','*','|','_','_','_','*'],
114             ['|','_','_','_','_','_',')']];
115 0           $self{"array_L"} = $array_L;
116              
117 0           my $array_M = [['*','_','*','*','*','*','*','*','_','*'],
118             ['|','*','*','\\','*','*','/','*','*','|'],
119             ['|','*','|','\\','\\','/','/','|','*','|'],
120             ['|','*','|','*','\\','/','*','|','*','|'],
121             ['|','_','|','*','*','*','*','|','_','|']];
122 0           $self{"array_M"} = $array_M;
123              
124 0           my $array_N = [['*','_','*','*','*','*','_','*'],
125             ['|','*','*','\\','*','|','*','|'],
126             ['|','*','|','\\','\\','|','*','|'],
127             ['|','*','|','*','\\','|','*','|'],
128             ['|','_','|','*','*','\\','_','|']];
129 0           $self{"array_N"} = $array_N;
130              
131 0           my $array_O = [['*','*','_','_','_','_','_','*','*'],
132             ['*','/','*','*','_','*','*','\\','*'],
133             ['|','*','*','/','*','\\','*','*','|'],
134             ['|','*','*','\\','*','/','*','*','|'],
135             ['*','\\','_','_','_','_','_','/','*']];
136 0           $self{"array_O"} = $array_O;
137              
138 0           my $array_P = [['*','_','_','_','_','*','*'],
139             ['|','*','*','_','*','\\','*'],
140             ['|','*','|','_',')','*','|'],
141             ['|','*','*','_','_','/','*'],
142             ['|','_','|','*','*','*','*']];
143 0           $self{"array_P"} = $array_P;
144              
145 0           my $array_Q = [['*','*','_','_','_','_','*','*'],
146             ['*','/','*','*','_','*','\\','*'],
147             ['|','*','*','(','*','|','*','|'],
148             ['*','\\','*','_','_','*','*','*'],
149             ['*','*','*','*','*','|','_','|']];
150 0           $self{"array_Q"} = $array_Q;
151              
152 0           my $array_R = [['*','_','_','_','_','*','*'],
153             ['|','*','*','_','*','\\','*'],
154             ['|','*','|','_',')','*','|'],
155             ['|','*','|','*','*','/','*'],
156             ['|','_','|','\\','_','\\','*']];
157 0           $self{"array_R"} = $array_R;
158              
159 0           my $array_S = [['*','_','_','_','*'],
160             ['/','_','_','_','|'],
161             ['\\','\\','_','*','*','*'],
162             ['*','_','_','\\','\\'],
163             ['|','_','_','_','/']];
164 0           $self{"array_S"} = $array_S;
165              
166 0           my $array_T = [['*','_','_','_','_','_','*'],
167             ['|','_','_','*','_','_','|'],
168             ['*','*','|','*','|','*','*'],
169             ['*','*','|','*','|','*','*'],
170             ['*','*','|','_','|','*','*']];
171 0           $self{"array_T"} = $array_T;
172              
173 0           my $array_U = [['*','_','*','*','*','*','_','*'],
174             ['|','*','|','*','*','|','*','|'],
175             ['|','*','|','*','*','|','*','|'],
176             ['|','*','\\','_','_','/','*','|'],
177             ['*','\\','_','_','_','_','/','*']];
178 0           $self{"array_U"} = $array_U;
179              
180 0           my $array_V = [['_','_','*','*','*','*','*','*','_','_'],
181             ['\\','*','\\','*','*','*','*','/','*','/'],
182             ['*','\\','*','\\','*','*','/','*','/','*'],
183             ['*','*','\\','*','\\','/','*','/','*','*'],
184             ['*','*','*','\\','_','_','/','*','*','*']];
185 0           $self{"array_V"} = $array_V;
186              
187 0           my $array_W = [['*','_','*','*','*','*','*','*','_','*'],
188             ['|','*','|','*','*','*','*','|','*','|'],
189             ['|','*','|','*','/','\\','*','|','*','|'],
190             ['|','*','|','/','/','\\','\\','|','*','|'],
191             ['|','_','*','/','*','*','\\','*','_','|']];
192 0           $self{"array_W"} = $array_W;
193              
194 0           my $array_X = [['*','_','*','*','*','*','_','*'],
195             ['\\','*','\\','*','*','/','*','/'],
196             ['*','\\','*','\\','/','*','/','*'],
197             ['*','/','*','/','\\','*','\\','*'],
198             ['/','_','/','*','*','\\','_','\\']];
199 0           $self{"array_X"} = $array_X;
200              
201 0           my $array_Y = [['*','_','*','*','*','*','_','*'],
202             ['\\','*','\\','*','*','/','*','/'],
203             ['*','\\','_','\\','/','_','/','*'],
204             ['*','*','*','|','*','|','*','*'],
205             ['*','*','*','|','_','|','*','*']];
206 0           $self{"array_Y"} = $array_Y;
207              
208 0           my $array_Z = [['*','_','_','_','_','_','*'],
209             ['|','_','_','*','*','*','|'],
210             ['|','*','*','/','*','/','*'],
211             ['*','*','/','*','/','_','_','_','*'],
212             ['*','|','_','_','_','_','_','_','|']];
213 0           $self{"array_Z"} = $array_Z;
214              
215             #draw number
216 0           my $array_1 = [['*','*','*','*','*'],
217             ['*','*','*','*','*'],
218             ['*','*','1','*','*'],
219             ['*','*','*','*','*'],
220             ['*','*','*','*','*']];
221 0           $self{"array_1"} = $array_1;
222              
223            
224 0           my $array_2 = [['*','*','*','_','_','_','_','*','*','*','*'],
225             ['*','*','|','_','_','_','*','\\','*','*','*'],
226             ['*','*','*','*','_','_',')','*','|','*','*'],
227             ['*','*','*','/','*','_','_','*','*','*','*'],
228             ['*','*','|','_','_','_','_','_','|','*','*']];
229 0           $self{"array_2"} = $array_2;
230              
231 0           my $array_3 = [['*','*','*','*','*'],
232             ['*','*','*','*','*'],
233             ['*','*','3','*','*'],
234             ['*','*','*','*','*'],
235             ['*','*','*','*','*']];
236 0           $self{"array_3"} = $array_3;
237              
238 0           my $array_4 = [['*','*','*','*','*','_','*','*','*','*','*','*','*'],
239             ['*','*','*','*','/','*','/','*','*','*','*','*','*'],
240             ['*','*','*','/','*','_','|','*','|','*','*','*','*'],
241             ['*','*','/','_','*','_','*','*','*','*','*','*','*'],
242             ['*','*','*','*','*','*','|','_','|','*','*','*','*']];
243 0           $self{"array_4"} = $array_4;
244              
245            
246 0           my $array_5 = [['*','*','*','_','_','_','_','*','*','*'],
247             ['*','*','|','*','_','_','_','|','*','*'],
248             ['*','*','|','_','_','*','*','*','*','*'],
249             ['*','*','*','*','_','\\','*','\\','*','*'],
250             ['*','*','/','_','_','_','*','/','*','*']];
251 0           $self{"array_5"} = $array_5;
252              
253 0           my $array_6 = [['*','*','*','*','*'],
254             ['*','*','*','*','*'],
255             ['*','*','6','*','*'],
256             ['*','*','*','*','*'],
257             ['*','*','*','*','*']];
258 0           $self{"array_6"} = $array_6;
259              
260 0           my $array_7 = [['*','*','*','_','_','_','_','_','_','*','*','*'],
261             ['*','*','|','_','_','_','*','*','*','|','*','*'],
262             ['*','*','*','*','*','*','/','*','/','*','*','*'],
263             ['*','*','*','*','*','/','*','/','*','*','*','*'],
264             ['*','*','*','*','/','_','/','*','*','*','*','*']];
265 0           $self{"array_7"} = $array_7;
266              
267            
268 0           my $array_8 = [['*','*','*','_','_','_','_','_','*','*','*'],
269             ['*','*','/','*','*','_','*','*','\\','*','*'],
270             ['*','*','\\','_','(','_',')','_','/','*','*'],
271             ['*','*','/','*','(','_',')','*','\\','*','*'],
272             ['*','*','\\','_','_','_','_','_','/','*','*']];
273 0           $self{"array_8"} = $array_8;
274              
275 0           my $array_9 = [['*','*','*','*','_','_','_','_','*','*','*','*'],
276             ['*','*','*','/','*','*','_','*','\\','*','*','*'],
277             ['*','*','|','*','*','(','_',')','*','|','*','*'],
278             ['*','*','*','\\','*','_','_','/','*','|','*','*'],
279             ['*','*','*','*','_','_','/','_','/','*','*','*']];
280 0           $self{"array_9"} = $array_9;
281              
282             #draw a space
283 0           my $array_XYZ = [['*','*','*'],['*','*','*'],['*','*','*'],['*','*','*'],['*','*','*']];
284 0           $self{"array_XYZ"} = $array_XYZ;
285            
286             #draw a colon
287 0           my $array_colon =[['*','*','*','*','*','*','*'],['*','*','*','_','*','*','*'],['*','*','(','_',')','*','*'],['*','*','*','_','*','*','*'],['*','*','(','_',')','*','*']];
288 0           $self{"array_colon"} = $array_colon;
289            
290             #draw a dot
291 0           my $array_dot =[['*','*','*','*','*','*'],['*','*','*','*','*','*'],['*','*','*','*','*','*'],['*','*','_','*','*','*'],['*','(','_',')','*','*']];
292 0           $self{"array_dot"} = $array_dot;
293              
294 0           my $lines = [];
295 0           $self{"lines"} = $lines;
296 0           return bless(\%self,$package);
297             }
298              
299             sub printString()
300             {
301 0     0 1   my $self = shift;
302 0           my $string = shift;
303              
304 0           $self->_createString($string);
305              
306 0           my $lines_ref = $self->{"lines"};
307            
308 0           for(my $i = 0; $i <= 4; $i++)
309             {
310 0           my $temps=$$lines_ref[$i];
311 0           foreach my $temp (@$temps)
312             {
313 0 0         if(not defined $temp){
    0          
314 0           print " ";
315             }
316             elsif($temp eq "*")
317             {
318 0           print " ";
319             }
320             else{
321 0           print $temp;
322             }
323             }
324 0           print "\n";
325             }
326             }
327              
328             sub _createString()
329             {
330 0     0     my $self = shift;
331 0           my $words = shift;
332              
333 0           $self->{"lines"} = $self->_createWord($words);
334             }
335              
336             #output a word
337             sub printWord()
338             {
339 0     0 0   my $self = shift;
340 0           my $word = shift;
341              
342 0           $self->_createWord($word);
343 0           my $lines_ref = $self->{"lines"};
344            
345 0           for(my $i = 0; $i <= 4; $i++)
346             {
347 0           my $temps=$$lines_ref[$i];
348 0           foreach my $temp (@$temps)
349             {
350 0 0         if(not defined $temp){
    0          
351 0           print " ";
352             }
353             elsif($temp eq "*")
354             {
355 0           print " ";
356             }
357             else{
358 0           print $temp;
359             }
360             }
361 0           print "\n";
362             }
363             }
364              
365             #create a word with several letters
366             sub _createWord()
367             {
368 0     0     my $self = shift;
369 0           my $word = shift;
370              
371 0           my @chars = split //,$word;
372 0           my @lines = ();
373 0           my ($temp_char,$char);
374 0           my $temp_array;
375 0           my ($i,$j);
376              
377 0           for ($i =0; $i<5;$i++)
378             {
379 0           my @line = ();
380 0           foreach $char ( @chars)
381             {
382 0 0         if($char eq " "){
    0          
    0          
    0          
383 0           $temp_array = $self->{"array_XYZ"};
384             }
385             elsif($char eq ":"){
386 0           $temp_array = $self->{"array_colon"};
387             }
388             elsif($char eq "."){
389 0           $temp_array = $self->{"array_dot"};
390             }
391             elsif($char =~/[0-9]/)
392             {
393 0           $temp_array = $self->{"array_".$char};
394             }
395             else{
396 0           $char = uc($char);
397 0           $temp_array = $self->{"array_".$char};
398             }
399 0           $temp_char = $$temp_array[$i];
400 0           for ($j = 0; $j < @$temp_char; $j++ )
401             {
402 0 0 0       if($j == 0 && $#line != -1){
403 0           my $temp = $line[$#line];
404 0 0         if($temp ne '*')
405             {
406 0           $line[$#line] = $temp;
407             }
408             else{
409 0           $line[$#line] = $$temp_char[$j];
410             }
411             }
412             else{
413 0           $line[$#line+1] = $$temp_char[$j];
414             }
415             }
416             }
417 0           push @lines, \@line;
418             }
419 0           $self->{"lines"} = \@lines;
420             }
421              
422             #output lines to file
423             sub saveToFile()
424             {
425 0     0 1   my $self = shift;
426 0           my $string = shift;
427 0           my $filename = shift;
428              
429 0 0         if(-e $filename)
430             {
431 0 0         die "$filename is a directory" if(-d $filename);
432 0 0         die "You have no permission to write content to $filename" unless(-w $filename);
433 0 0         die "$filename is not a text file" unless(-f $filename);
434              
435             }
436 0 0         open(OUT, ">$filename") or die "Can not create an file named ".$filename."\n";
437              
438 0           $self->_createWord($string);
439 0           my $lines_ref = $self->{"lines"};
440            
441 0           for(my $i = 0; $i <= 4; $i++)
442             {
443 0           my $temps=$$lines_ref[$i];
444 0           foreach my $temp (@$temps)
445             {
446 0 0         if(not defined $temp){
    0          
447 0           print OUT " ";
448             }
449             elsif($temp eq "*")
450             {
451 0           print OUT " ";
452             }
453             else{
454 0           print OUT $temp;
455             }
456             }
457 0           print OUT "\n";
458             }
459              
460 0           close(OUT);
461             }
462              
463              
464             1;
465              
466             __END__
467              
468             =head1 NAME
469              
470             Acme::Letter - Perl extension for drawing beautiful letter
471              
472             =head1 SYNOPSIS
473              
474             use Acme::Letter;
475             #create an Acme::Letter object
476             $letter = Acme::Letter->new();
477             $string = 'PDF::API 2';
478             $letter->printString($string);
479              
480             =head1 DESCRIPTION
481              
482             This module draw several lines which like a letter. It is beautiful! You can draw string with letter, colon and dot. Now I have no idea how to desgin number. So you need to draw it by yourself.
483              
484             =head2 Methods
485              
486             =over 4
487              
488             =item * $letter->printLetter($arg)
489              
490             get a letter, such as a-z or A-Z, return several lines which like a letter.
491              
492             =item * $letter->printString($string);
493              
494             get a string, return several lines which like a letter. The String include dot, colon.
495              
496             =item * $letter-saveToFile($string,$filename)
497              
498             get a letter, such as a-z or A-Z, create several lines and put into a file named $filename.
499              
500             =back
501              
502             =head2 Examples
503              
504             =over 4
505              
506             =item * Examples foreach @Letter.
507              
508             A.
509              
510             _
511             / \
512             / _ \
513             / ___ \
514             /_/ \_\
515              
516             B.
517              
518             _____
519             | _ \
520             |_|_)_/
521             | |_) \
522             |_____/
523              
524             C.
525              
526             _____
527             / ___|
528             | /
529             | \___
530             \_____|
531              
532             D.
533              
534             _____
535             | _ \
536             | | \ |
537             | |_/ |
538             |_____/
539              
540             E.
541              
542             _____
543             | ___|
544             | |__
545             | |___
546             |_____|
547              
548             F.
549              
550             _____
551             | ___|
552             | |_
553             | _|
554             |_|
555              
556             H.
557              
558             _ _
559             | | | |
560             |_|_|_|
561             | | | |
562             |_| |_|
563              
564             I.
565              
566             _____
567             |__ __|
568             | |
569             _|_|_
570             |_____|
571              
572             J.
573              
574             _____
575             |__ __|
576             | |
577             _| |
578             \_/
579              
580             K.
581              
582             _ _
583             | | //
584             | |//
585             | |\\
586             |_| \\
587              
588             L.
589              
590             _
591             | |
592             | |
593             | |___
594             |_____)
595              
596             N.
597              
598             _ _
599             | \ | |
600             | |\\| |
601             | | \| |
602             |_| \_|
603              
604             O.
605              
606             _____
607             / _ \
608             | / \ |
609             | \_/ |
610             \_____/
611              
612             P.
613              
614             ____
615             | _ \
616             | |_) |
617             | __/
618             |_|
619              
620             R.
621              
622             ____
623             | _ \
624             | |_) |
625             | | /
626             |_|\_\
627              
628             T.
629              
630             _____
631             |__ __|
632             | |
633             | |
634             |_|
635              
636             M.
637              
638             _ _
639             | \ / |
640             | |\\//| |
641             | | \/ | |
642             |_| |_|
643              
644             G.
645              
646             _____
647             / ___|
648             | / __
649             | \___|
650             \_____|
651              
652              
653             S.
654              
655             ___
656             /___|
657             \\_
658             __\\
659             |___/
660              
661              
662             U.
663              
664             _ _
665             | | | |
666             | | | |
667             | \__/ |
668             \____/
669              
670              
671             V.
672              
673             __ __
674             \ \ / /
675             \ \ / /
676             \ \/ /
677             \__/
678              
679              
680             X.
681              
682             _ _
683             \ \ / /
684             \ \/ /
685             / /\ \
686             /_/ \_\
687              
688              
689             Y.
690              
691             _ _
692             \ \ / /
693             \_\/_/
694             | |
695             |_|
696              
697             Z.
698              
699             _____
700             |__ |
701             | / /
702             / /___
703             |______|
704              
705             Q.
706              
707             ____
708             / _ \
709             | (_| |
710             \ __ |
711             |_|
712              
713             =item * Example for dot and colon
714              
715             dot.
716              
717             _
718             (_)
719              
720             colon.
721              
722             _
723             (_)
724             _
725             (_)
726              
727             =item * Example for Number
728              
729             2.
730              
731             ____
732             |___ \
733             __) |
734             / __
735             |_____|
736              
737             =back
738              
739             =head1 AUTHOR
740              
741             Lei Xue (carmark@cpan.org/carmark.xue@gmail.com)
742              
743             =head1 COPYRIGHT AND LICENSE
744              
745             Copyright (C) 2010 by Lei Xue
746              
747             This library is free software; you can redistribute it and/or modify
748             it under the same terms as Perl itself, either Perl version 5.10.1 or,
749             at your option, any later version of Perl 5 you may have available.
750              
751             I love my girl, XiaoFu!
752              
753              
754             =cut