File Coverage

blib/lib/Lingua/HEB/Word2Num.pm
Criterion Covered Total %
statement 23 27 85.1
branch 0 2 0.0
condition 2 4 50.0
subroutine 9 10 90.0
pod 3 3 100.0
total 37 46 80.4


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; eval: (folding-mode 1); coding:utf-8 -*-
2             package Lingua::HEB::Word2Num;
3             # ABSTRACT: Word to number conversion in Hebrew
4              
5 1     1   130697 use 5.16.0;
  1         3  
6 1     1   4 use utf8;
  1         1  
  1         9  
7 1     1   17 use warnings;
  1         3  
  1         48  
8              
9             # {{{ use block
10              
11 1     1   476 use Export::Attrs;
  1         7889  
  1         6  
12 1     1   1080 use Parse::RecDescent;
  1         30236  
  1         7  
13              
14             # }}}
15             # {{{ var block
16             our $VERSION = '0.2603300';
17             my $parser = heb_numerals();
18              
19             # }}}
20              
21             # {{{ w2n convert text to number
22              
23             sub w2n :Export {
24 2   100 2 1 192918 my $input = shift // return;
25              
26 1         19 return $parser->numeral($input);
27 1     1   101 }
  1         2  
  1         6  
28              
29             # }}}
30             # {{{ heb_numerals create parser for hebrew numerals
31              
32             sub heb_numerals {
33 1     1 1 3 return Parse::RecDescent->new(q{
34            
35              
36             numeral: mega
37             | kOhOd
38             | { }
39              
40             number: /אחד עשר/ { 11 }
41             | /שנים עשר/ { 12 }
42             | /שלושה עשר/ { 13 }
43             | /ארבעה עשר/ { 14 }
44             | /חמישה עשר/ { 15 }
45             | /שישה עשר/ { 16 }
46             | /שבעה עשר/ { 17 }
47             | /שמונה עשר/ { 18 }
48             | /תשעה עשר/ { 19 }
49             | /אפס/ { 0 }
50             | /אחד/ { 1 }
51             | /שניים/ { 2 }
52             | /שלושה/ { 3 }
53             | /ארבעה/ { 4 }
54             | /חמישה/ { 5 }
55             | /שישה/ { 6 }
56             | /שבעה/ { 7 }
57             | /שמונה/ { 8 }
58             | /תשעה/ { 9 }
59             | /עשרה/ { 10 }
60              
61             tens: /עשרים/ { 20 }
62             | /שלושים/ { 30 }
63             | /ארבעים/ { 40 }
64             | /חמישים/ { 50 }
65             | /שישים/ { 60 }
66             | /שבעים/ { 70 }
67             | /שמונים/ { 80 }
68             | /תשעים/ { 90 }
69              
70             deca: tens /ו/ number { $item[1] + $item[3] }
71             | tens
72             | number
73              
74             hecto: /מאתיים/ deca { 200 + $item[2] }
75             | /מאתיים/ { 200 }
76             | /שלוש מאות/ deca { 300 + $item[2] }
77             | /שלוש מאות/ { 300 }
78             | /ארבע מאות/ deca { 400 + $item[2] }
79             | /ארבע מאות/ { 400 }
80             | /חמש מאות/ deca { 500 + $item[2] }
81             | /חמש מאות/ { 500 }
82             | /שש מאות/ deca { 600 + $item[2] }
83             | /שש מאות/ { 600 }
84             | /שבע מאות/ deca { 700 + $item[2] }
85             | /שבע מאות/ { 700 }
86             | /שמונה מאות/ deca { 800 + $item[2] }
87             | /שמונה מאות/ { 800 }
88             | /תשע מאות/ deca { 900 + $item[2] }
89             | /תשע מאות/ { 900 }
90             | /מאה/ deca { 100 + $item[2] }
91             | /מאה/ { 100 }
92              
93             hOd: hecto
94             | deca
95              
96             kilo: /אלפיים/ hOd { 2000 + $item[2] }
97             | /אלפיים/ { 2000 }
98             | /שלושת אלפים/ hOd { 3000 + $item[2] }
99             | /שלושת אלפים/ { 3000 }
100             | /ארבעת אלפים/ hOd { 4000 + $item[2] }
101             | /ארבעת אלפים/ { 4000 }
102             | /חמשת אלפים/ hOd { 5000 + $item[2] }
103             | /חמשת אלפים/ { 5000 }
104             | /ששת אלפים/ hOd { 6000 + $item[2] }
105             | /ששת אלפים/ { 6000 }
106             | /שבעת אלפים/ hOd { 7000 + $item[2] }
107             | /שבעת אלפים/ { 7000 }
108             | /שמונת אלפים/ hOd { 8000 + $item[2] }
109             | /שמונת אלפים/ { 8000 }
110             | /תשעת אלפים/ hOd { 9000 + $item[2] }
111             | /תשעת אלפים/ { 9000 }
112             | hOd /אלף/ hOd { $item[1] * 1000 + $item[3] }
113             | hOd /אלף/ { $item[1] * 1000 }
114             | /אלף/ hOd { 1000 + $item[2] }
115             | /אלף/ { 1000 }
116              
117             kOhOd: kilo
118             | hOd
119              
120             mega: hOd /מיליון/ kOhOd { $item[1] * 1_000_000 + $item[3] }
121             | hOd /מיליון/ { $item[1] * 1_000_000 }
122             | /מיליון/ kOhOd { 1_000_000 + $item[2] }
123             | /מיליון/ { 1_000_000 }
124             });
125             }
126              
127             # }}}
128             # {{{ ordinal2cardinal convert ordinal text to cardinal text
129              
130             sub ordinal2cardinal :Export {
131 0   0 0 1   my $input = shift // return;
132              
133             # Hebrew ordinal specials (1-10) → cardinal forms expected by w2n parser.
134             # The parser uses masculine construct forms (אחד, שניים, שלושה, etc.)
135 0           state $specials = {
136             'ראשון' => 'אחד', # 1st → אחד (parser: 1)
137             'שני' => 'שניים', # 2nd → שניים (parser: 2)
138             'שלישי' => 'שלושה', # 3rd → שלושה (parser: 3)
139             'רביעי' => 'ארבעה', # 4th → ארבעה (parser: 4)
140             'חמישי' => 'חמישה', # 5th → חמישה (parser: 5)
141             'שישי' => 'שישה', # 6th → שישה (parser: 6)
142             'שביעי' => 'שבעה', # 7th → שבעה (parser: 7)
143             'שמיני' => 'שמונה', # 8th → שמונה (parser: 8)
144             'תשיעי' => 'תשעה', # 9th → תשעה (parser: 9)
145             'עשירי' => 'עשרה', # 10th → עשרה (parser: 10)
146             };
147              
148 0 0         return $specials->{$input} if exists $specials->{$input};
149              
150             # For 11+, ordinals ARE the cardinal form — return unchanged.
151 0           return $input;
152 1     1   398 }
  1         2  
  1         4  
153              
154             # }}}
155              
156             1;
157              
158             __END__