File Coverage

blib/lib/Lingua/MLT/Word2Num.pm
Criterion Covered Total %
statement 25 25 100.0
branch n/a
condition 2 2 100.0
subroutine 9 9 100.0
pod 3 3 100.0
total 39 39 100.0


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; eval: (folding-mode 1); coding:utf-8 -*-
2             package Lingua::MLT::Word2Num;
3             # ABSTRACT: Word to number conversion in Maltese
4              
5 1     1   140597 use 5.16.0;
  1         5  
6 1     1   6 use utf8;
  1         3  
  1         16  
7 1     1   38 use warnings;
  1         2  
  1         89  
8              
9             # {{{ use block
10              
11 1     1   776 use Export::Attrs;
  1         13953  
  1         8  
12 1     1   1424 use Parse::RecDescent;
  1         56893  
  1         11  
13              
14             # }}}
15             # {{{ var block
16             our $VERSION = '0.2603300';
17             my $parser = mlt_numerals();
18              
19             # }}}
20              
21             # {{{ w2n convert text to number
22              
23             sub w2n :Export {
24 29   100 29 1 1185618 my $input = shift // return;
25              
26             # Normalize whitespace
27 28         180 $input =~ s/\A\s+//;
28 28         164 $input =~ s/\s+\z//;
29 28         101 $input =~ s/\s+/ /g;
30              
31             # Normalize to lowercase
32 28         157 $input = lc $input;
33              
34 28         313 return $parser->numeral($input);
35 1     1   272 }
  1         8  
  1         10  
36              
37             # }}}
38             # {{{ mlt_numerals create parser for maltese numerals
39              
40             sub mlt_numerals {
41 1     1 1 5 return Parse::RecDescent->new(q{
42            
43              
44             numeral: mega
45             | kOhOd
46             | { }
47              
48             # --- Units ---
49             number: /\bxejn\b/ { 0 }
50             | /\bżero\b/ { 0 }
51             | /\bwieħed\b/ { 1 }
52             | /\bwaħda\b/ { 1 }
53             | /\btnejn\b/ { 2 }
54             | /\btlieta\b/ { 3 }
55             | /\berbgħa\b/ { 4 }
56             | /\bħamsa\b/ { 5 }
57             | /\bsitta\b/ { 6 }
58             | /\bsebgħa\b/ { 7 }
59             | /\btmienja\b/ { 8 }
60             | /\bdisgħa\b/ { 9 }
61              
62             ten: /\bgħaxra\b/ { 10 }
63              
64             # --- Teens (11-19) ---
65             teen: /\bħdax\b/ { 11 }
66             | /\btnax\b/ { 12 }
67             | /\btlettax\b/ { 13 }
68             | /\berbatax\b/ { 14 }
69             | /\bħmistax\b/ { 15 }
70             | /\bsittax\b/ { 16 }
71             | /\bsbatax\b/ { 17 }
72             | /\btmintax\b/ { 18 }
73             | /\bdsatax\b/ { 19 }
74              
75             # --- Tens (20-90) ---
76             tens: /\bgħoxrin\b/ { 20 }
77             | /\btletin\b/ { 30 }
78             | /\berbgħin\b/ { 40 }
79             | /\bħamsin\b/ { 50 }
80             | /\bsittin\b/ { 60 }
81             | /\bsebgħin\b/ { 70 }
82             | /\btmenin\b/ { 80 }
83             | /\bdisgħin\b/ { 90 }
84              
85             # --- Connector (u = and) ---
86             u: "u"
87              
88             # --- Deca: units + u + tens (Maltese order) or standalone ---
89             deca: number u tens { $item[1] + $item[3] }
90             | u deca { $item[2] }
91             | teen
92             | tens
93             | ten
94             | number
95              
96             # --- Hundreds ---
97             # mitejn = 200 (dual)
98             mitejn: /\bmitejn\b/ { 200 }
99              
100             # Compound hundreds: tliet mija etc.
101             # NOTE: erba', seba', disa' end in apostrophe — \b fails after '
102             # because ' is non-word. Use (?=\s|$) instead of trailing \b.
103             hund_pfx: /\btliet\b/ { 3 }
104             | /\berba'(?=\s|$)/ { 4 }
105             | /\bħames\b/ { 5 }
106             | /\bsitt\b/ { 6 }
107             | /\bseba'(?=\s|$)/ { 7 }
108             | /\btminn\b/ { 8 }
109             | /\bdisa'(?=\s|$)/ { 9 }
110              
111             # mija - hundred
112             mija: /\bmija\b/
113              
114             hecto: mitejn u deca { 200 + $item[3] }
115             | mitejn { 200 }
116             | hund_pfx mija u deca { $item[1] * 100 + $item[4] }
117             | hund_pfx mija { $item[1] * 100 }
118             | mija u deca { 100 + $item[3] }
119             | mija { 100 }
120              
121             hOd: hecto
122             | deca
123              
124             # --- Thousands ---
125             # elfejn = 2000 (dual)
126             elfejn: /\belfejn\b/ { 2000 }
127              
128             # elf - singular thousand
129             elf: /\belf\b/
130              
131             # elef - plural thousand (3-10)
132             elef: /\belef\b/
133              
134             # Compound thousands: tlitt elef, erbat elef etc.
135             thou_pfx: /\btlitt\b/ { 3 }
136             | /\berbat\b/ { 4 }
137             | /\bħamest\b/ { 5 }
138             | /\bsitt\b/ { 6 }
139             | /\bsebat\b/ { 7 }
140             | /\btmint\b/ { 8 }
141             | /\bdisat\b/ { 9 }
142             | /\bgħaxart\b/ { 10 }
143              
144             elf_any: elef | elf
145              
146             kilo: elfejn u hOd { 2000 + $item[3] }
147             | elfejn { 2000 }
148             | thou_pfx elf_any u hOd { $item[1] * 1000 + $item[4] }
149             | thou_pfx elf_any { $item[1] * 1000 }
150             | hOd elf_any u hOd { $item[1] * 1000 + $item[4] }
151             | hOd elf_any { $item[1] * 1000 }
152             | elf u hOd { 1000 + $item[3] }
153             | elf { 1000 }
154              
155             kOhOd: kilo
156             | hOd
157              
158             # --- Millions ---
159             miljun: /\bmiljun\b/
160             miljuni: /\bmiljuni\b/
161              
162             # żewġ miljuni = 2 million (dual form)
163             zewg: /\bżewġ\b/
164              
165             mega: hOd miljun u kOhOd { $item[1] * 1_000_000 + $item[4] }
166             | hOd miljun { $item[1] * 1_000_000 }
167             | zewg miljuni u kOhOd { 2_000_000 + $item[4] }
168             | zewg miljuni { 2_000_000 }
169             | miljun u kOhOd { 1_000_000 + $item[3] }
170             | miljun { 1_000_000 }
171             });
172             }
173              
174             # }}}
175              
176             # {{{ capabilities declare supported features
177              
178             sub capabilities {
179             return {
180 1     1 1 345 cardinal => 1,
181             ordinal => 0,
182             };
183             }
184              
185             # }}}
186              
187             1;
188              
189             __END__