File Coverage

lib/Convert/Number/Coptic.pm
Criterion Covered Total %
statement 62 66 93.9
branch 17 20 85.0
condition 3 7 42.8
subroutine 11 11 100.0
pod 0 4 0.0
total 93 108 86.1


line stmt bran cond sub pod time code
1             package Convert::Number::Coptic;
2              
3 1     1   13838 use utf8; # can't find a way to conditionally load this with
  1         2  
  1         6  
4             # the scope applying throughout
5              
6             BEGIN
7             {
8 1     1   63 use strict;
  1         2  
  1         33  
9 1     1   7 use warnings;
  1         1  
  1         75  
10 1     1   8 use vars qw($VERSION @CNumbers %CNumbers);
  1         1  
  1         346  
11              
12 1     1   6 $VERSION = "0.15";
13              
14 1         18 require 5.000;
15              
16 1         10 @CNumbers =(
17             ["α", "β", "γ", "δ", "ε", "ϛ", "ζ", "η", "θ"],
18             ["ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ϥ"],
19             ["ρ", "ϲ", "τ", "υ", "φ", "χ", "ψ", "ω", "ϣ"]
20             );
21 1         1165 %CNumbers =(
22             'α' => 1,
23             'β' => 2,
24             'γ' => 3,
25             'δ' => 4,
26             'ε' => 5,
27             'ϛ' => 6,
28             'ζ' => 7,
29             'η' => 8,
30             'θ' => 9,
31             'ι' => 10,
32             'κ' => 20,
33             'λ' => 30,
34             'μ' => 40,
35             'ν' => 50,
36             'ξ' => 60,
37             'ο' => 70,
38             'π' => 80,
39             'ϥ' => 90,
40             'ρ' => 100,
41             'ϲ' => 200,
42             'τ' => 300,
43             'υ' => 400,
44             'φ' => 500,
45             'χ' => 600,
46             'ψ' => 700,
47             'ω' => 800,
48             'ϣ' => 900
49             );
50              
51             }
52              
53              
54             sub _setArgs
55             {
56 190     190   259 my $self = shift;
57              
58 190 50       432 if ( $#_ ) {
59 0         0 warn ( "too many arguments." );
60 0         0 return;
61             }
62 190         321 my $number = shift;
63 190 50 66     1337 unless ( ($number =~ /^\d+$/) || ($number =~ /([α-ρς-ωϛϲ])/) ) {
64 0         0 warn ( "$number is not a number." );
65 0         0 return;
66             }
67              
68 190         408 $self->{number} = $number;
69              
70 190         423 1;
71             }
72              
73              
74             sub new
75             {
76 1     1 0 201233 my $class = shift;
77 1         3 my $self = {};
78              
79 1         4 my $blessing = bless ( $self, $class );
80              
81 1         6 $self->{number} = undef;
82              
83 1 50 0     8 $self->_setArgs ( @_ ) || return if ( @_ );
84              
85 1         4 $blessing;
86             }
87              
88              
89             sub _fromCoptic
90             {
91 95     95   175 $_ = $_[0]->{number};
92 95         370 s/̄//og;
93 95         290 s/̱/000/og;
94 95         240 s/͇/000000/og;
95 95         989 s/([α-ρς-ωϛϲ])/$CNumbers{$1}/og;
96              
97 95         190 my $out = 0;
98 95         505 s/(\d0+)/$out += $1/oge;
  252         1064  
99 95         314 s/(\d)$/$out += $1/oe;
  95         248  
100              
101 95         259 $out;
102             }
103              
104              
105             sub toCoptic
106             {
107 95     95 0 166 my $number = $_[0]->{number};
108              
109 95         159 my $n = length ( $number ) - 1;
110              
111             # map and return a single digit number
112             # don't waste time with the loop:
113 95 100       227 return ( "$CNumbers[0][$number-1]̄" ) unless ( $n );
114              
115              
116 91         322 my @aNumberString = split ( //, $number );
117 91         164 my $cNumberString = "";
118              
119              
120             #
121             # read number from most to least significant digits:
122             #
123 91         232 for ( my $place = $n; $place >= 0; $place-- ) {
124              
125 582         904 my $pos = $place % 3;
126 582         937 my $cycles = int $place / 3;
127              
128 582         881 my $aNum = $aNumberString[$n-$place];
129 582 100       1259 next unless ( $aNum );
130 305         634 $cNumberString .= $CNumbers[$pos][$aNum-1];
131              
132 305 100       534 if ( $cycles ) {
133             #
134             # add an even number of = symbols
135             #
136 171         440 for ( my $i = 0; $i<(int $cycles/2); $i++ ) {
137 75         175 $cNumberString .= "͇";
138             }
139 171 100       520 $cNumberString .= "̱" if ( $cycles % 2 ); # if odd
140             }
141             else {
142 134         310 $cNumberString .= "̄";
143             }
144              
145             }
146              
147 91         404 $cNumberString;
148             }
149              
150              
151             sub convert
152             {
153 190     190 0 667 my $self = shift;
154              
155             #
156             # reset string if we've been passed one:
157             #
158 190 100       484 $self->number ( @_ ) if ( @_ );
159              
160 190 100       321 ( $self->number =~ /^[0-9]+$/ )
161             ? $self->toCoptic
162             : $self->_fromCoptic
163             ;
164             }
165              
166              
167             sub number
168             {
169 380     380 0 7184 my $self = shift;
170              
171 380 100 50     920 $self->_setArgs ( @_ ) || return
172             if ( @_ );
173              
174 380         1173 $self->{number};
175             }
176              
177              
178             #########################################################
179             # Do not change this, Do not put anything below this.
180             # File must return "true" value at termination
181             1;
182             ##########################################################
183              
184              
185             __END__