File Coverage

blib/lib/Lingua/POL/Word2Num.pm
Criterion Covered Total %
statement 18 18 100.0
branch n/a
condition 2 2 100.0
subroutine 7 7 100.0
pod 2 2 100.0
total 29 29 100.0


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; eval: (folding-mode 1) -*-
2              
3             package Lingua::POL::Word2Num;
4             # ABSTRACT: Word 2 number conversion in POL.
5              
6             # {{{ use block
7              
8 1     1   86652 use 5.16.0;
  1         5  
9 1     1   8 use utf8;
  1         2  
  1         17  
10              
11 1     1   736 use Export::Attrs;
  1         13330  
  1         29  
12 1     1   1419 use Parse::RecDescent;
  1         55111  
  1         12  
13              
14             # }}}
15             # {{{ var block
16             our $VERSION = '0.2603230';
17             my $COPY = 'Copyright (c) PetaMem, s.r.o. 2003-present';
18             my $parser = pol_numerals();
19              
20             # }}}
21              
22             # {{{ w2n convert number to text
23              
24             sub w2n :Export {
25 3   100 3 1 237291 my $input = shift // return;
26              
27             # print "INPUT: '$input'\n";
28 2         8 $input =~ s{\s\z}{}xms;
29             # print "INPUT: '$input'\n";
30              
31 2         26 return $parser->numeral($input);
32 1     1   189 }
  1         3  
  1         65  
33              
34             # }}}
35             # {{{ pol_numerals create parser for numerals
36              
37             sub pol_numerals {
38 1     1 1 8 return Parse::RecDescent->new(q{
39            
40              
41             numeral: mega
42             | kOhOd
43             | 'zero' { 0 }
44             | { }
45              
46             number: 'dziewiętnaście' { 19 }
47             | 'osiemnaście' { 18 }
48             | 'siedemnaście' { 17 }
49             | 'szesnaście' { 16 }
50             | 'piętnaście' { 15 }
51             | 'czternaście' { 14 }
52             | 'trzynaście' { 13 }
53             | 'dwanaście' { 12 }
54             | 'jedenaście' { 11 }
55             | 'dziesięć' { 10 }
56             | 'dziewięć' { 9 }
57             | 'osiem' { 8 }
58             | 'siedem' { 7 }
59             | 'sześć' { 6 }
60             | 'pięć' { 5 }
61             | 'cztery' { 4 }
62             | 'trzy' { 3 }
63             | 'dwa' { 2 }
64             | 'jeden' { 1 }
65              
66             tens: 'dwadzieścia' { 20 }
67             | 'trzydzieści' { 30 }
68             | 'czterdzieści' { 40 }
69             | 'pięćdziesiąt' { 50 }
70             | 'sześćdziesiąt' { 60 }
71             | 'siedemdziesiąt' { 70 }
72             | 'osiemdziesiąt' { 80 }
73             | 'dziewięćdziesiąt' { 90 }
74              
75             deca: tens number { $item[1] + $item[2] }
76             | tens
77             | number
78              
79             hecto: number /(sta|set)/ deca { $item[1] * 100 + $item[3] }
80             | number /(sta|set)/ { $item[1] * 100 }
81             | 'dwieście' deca { 2 * 100 + $item[2] }
82             | 'dwieście' { 200 }
83             | 'sto' deca { 100 + $item[2] }
84             | 'sto' { 100 }
85              
86             hOd: hecto
87             | deca
88              
89             kilo: hOd /(tysiąc[ae]?|tysięcy)/ hOd { $item[1] * 1000 + $item[3] }
90             | hOd /(tysiąc[ae]?|tysięcy)/ { $item[1] * 1000 }
91             | number /(tysiąc[ae]?|tysięcy)/ hOd { $item[1] * 1000 + $item[3] }
92             | number /(tysiąc[ae]?|tysięcy)/ { $item[1] * 1000 }
93             | 'tysiąc' hOd { 1000 + $item[2] }
94             | 'tysiąc' { 1000 }
95             | hOd 'jeden' 'tysiąc' hOd { ($item[1] + 1) * 1000 + $item[4] }
96             | hOd 'jeden' 'tysiąc' { ($item[1] + 1) * 1000 }
97              
98             kOhOd: kilo
99             | hOd
100              
101             mega: hOd megas kOhOd { $item[1] * 1_000_000 + $item[3] }
102             | hOd megas { $item[1] * 1_000_000 }
103              
104             megas: /milion(y|ów)?/
105             });
106             }
107              
108             # }}}
109              
110             1;
111              
112             __END__