File Coverage

blib/lib/Lingua/LO/NLP/Romanize/IPA.pm
Criterion Covered Total %
statement 41 41 100.0
branch 4 4 100.0
condition n/a
subroutine 14 14 100.0
pod 2 2 100.0
total 61 61 100.0


line stmt bran cond sub pod time code
1             package Lingua::LO::NLP::Romanize::IPA;
2 1     1   6 use strict;
  1         2  
  1         35  
3 1     1   8 use warnings;
  1         2  
  1         38  
4 1     1   17 use 5.012000;
  1         3  
5 1     1   4 use utf8;
  1         2  
  1         6  
6 1     1   22 use feature qw/ unicode_strings say /;
  1         2  
  1         83  
7 1     1   9 use charnames qw/ :full lao /;
  1         1  
  1         6  
8 1     1   498 use version 0.77; our $VERSION = version->declare('v1.0.1');
  1         25  
  1         8  
9 1     1   114 use Carp;
  1         3  
  1         66  
10 1     1   332 use Lingua::LO::NLP::Analyze;
  1         5  
  1         12  
11 1     1   52 use parent 'Lingua::LO::NLP::Romanize::PCGN';
  1         2  
  1         6  
12              
13             =encoding utf8
14              
15             =head1 NAME
16              
17             Lingua::LO::NLP::Romanize::IPA - Convert Lao syllables to the International Phonetic Alphabet
18              
19             =head1 FUNCTION
20              
21             This class is not supposed to be used directly. Rather use
22             L as a factory:
23              
24             my $o = Lingua::LO::NLP::Romanize->new(variant => 'IPA');
25              
26             =cut
27              
28             my %CONSONANTS = (
29             'ກ' => 'k',
30             'ຂ' => 'kʰ',
31             'ຄ' => 'kʰ',
32             'ງ' => 'ŋ',
33             'ຈ' => 'tɕ',
34             'ສ' => 's',
35             'ຊ' => 's',
36             'ຍ' => 'ɲ',
37             'ດ' => [qw/ d t /],
38             'ຕ' => 't',
39             'ຖ' => 'tʰ',
40             'ທ' => 'tʰ',
41             'ນ' => 'n',
42             'ບ' => [qw/ b p /],
43             'ປ' => 'p',
44             'ຜ' => 'pʰ',
45             'ຝ' => 'f',
46             'ພ' => 'pʰ',
47             'ຟ' => 'f',
48             'ມ' => 'm',
49             'ຢ' => 'j',
50             'ລ' => 'l',
51             "\N{LAO SEMIVOWEL SIGN LO}" => 'l',
52             'ວ' => [qw/ ʋ w /],
53             'ຫ' => 'h',
54             'ອ' => 'ʔ',
55             'ຮ' => 'h',
56             'ຣ' => 'r',
57             'ໜ' => 'n',
58             'ໝ' => 'm',
59             'ຫຼ' => 'l',
60             'ຫຍ' => 'ɲ',
61             'ຫນ' => 'n',
62             'ຫມ' => 'm',
63             'ຫຣ' => 'r',
64             'ຫລ' => 'l',
65             'ຫວ' => 'ʋ',
66             );
67              
68             my %VOWELS = (
69             ### Monophthongs
70             'Xະ' => 'aʔ',
71             'Xັ' => 'a',
72             'Xາ' => 'aː',
73             'Xາວ' => 'aːo',
74              
75             'Xິ' => 'i',
76             'Xີ' => 'iː',
77             'Xິວ' => 'iu', # TODO correct?
78             'Xີວ' => 'iːu', # TODO correct?
79              
80             'Xຶ' => 'ɯ',
81             'Xື' => 'ɯː',
82              
83             'Xຸ' => 'u',
84             'Xູ' => 'uː',
85              
86             'ເXະ' => 'eʔ',
87             'ເXັ' => 'e',
88             'ເX' => 'eː',
89              
90             'ແXະ' => 'ɛʔ',
91             'ແXັ' => 'ɛ',
92             'ແX' => 'ɛː',
93             'ແXວ' => 'ɛːo',
94              
95             'ໂXະ' => 'oʔ',
96             'Xົ' => 'o',
97             'ໂX' => 'oː',
98             'ໂXຍ' => 'oːi',
99              
100             'ເXາະ' => 'ɔʔ',
101             'Xັອ' => 'ɔ',
102             'Xໍ' => 'ɔː',
103             'Xອ' => 'ɔː',
104             'Xອຍ' => 'ɔːi',
105              
106             'ເXິ' => 'ɤ',
107             'ເXີ' => 'ɤː',
108              
109             'ເXັຍ' => 'iə',
110             'Xັຽ' => 'iə',
111             'ເXຍ' => 'iːə',
112             'Xຽ' => 'iːə',
113             'Xຽວ' => 'iːəo', # TODO correct?
114              
115             'ເXີຍ' => 'ɤːi',
116             'ເXິຍ' => 'ɤi',
117              
118             'ເXຶອ' => 'ɯə',
119             'ເXືອ' => 'ɯːə',
120             'ເXືອຍ' => 'ɯːəi',
121              
122             'Xົວະ' => 'uəʔ',
123             'Xົວ' => 'uːə',
124             'Xວ' => 'uːə',
125             'Xວຍ' => 'uːəi',
126              
127             'ໄX' => 'aj',
128             'ໃX' => 'aj',
129             'Xາຍ' => 'aːj',
130             'Xັຍ' => 'aj',
131              
132             'ເXົາ' => 'aw',
133             'Xຳ' => 'am', # composed U+0EB3
134             'Xໍາ' => 'am',
135             );
136             {
137             # Replace "X" in %VOWELS keys with DOTTED CIRCLE. Makes code easier to edit.
138             my %v;
139             foreach my $v (keys %VOWELS) {
140             (my $w = $v) =~ s/X/\N{DOTTED CIRCLE}/;
141             $v{$w} = $VOWELS{$v};
142             }
143             %VOWELS = %v;
144             }
145              
146             my %TONE_DIACRITICS = (
147             LOW => "\N{COMBINING GRAVE ACCENT}",
148             MID => "\N{COMBINING MACRON}", MID_STOP => "\N{COMBINING MACRON}",
149             HIGH => "\N{COMBINING ACUTE ACCENT}", HIGH_STOP => "\N{COMBINING ACUTE ACCENT}",
150             RISING => "\N{COMBINING CARON}",
151             HIGH_FALLING => "\N{COMBINING CIRCUMFLEX ACCENT}",
152             MID_FALLING => "\N{COMBINING CIRCUMFLEX ACCENT BELOW}",
153             );
154              
155             =head2 new
156              
157             You don't call this constructor directly but via L.
158             It adds the following attribute:
159              
160             =over 4
161              
162             =item C: boolean indicating whether to add dicacritics for tone
163              
164             =back
165              
166             =cut
167              
168             sub new {
169 2     2 1 5 my ($class, %args) = @_;
170 2         5 my $self = bless {}, $class;
171 2 100       13 $self->{romanize_vowel} = $args{tone} ? \&_vowel_with_tone : \&_vowel_without_tone;
172 2         6 return $self;
173             }
174              
175             sub _vowel_with_tone {
176 14     14   96 my ($lao_vowel, $tone) = @_;
177 14         33 my $vowel = $VOWELS{ $lao_vowel };
178             # Insert tone diacritic after first character
179 14         60 substr($vowel, 1, 0) = $TONE_DIACRITICS{ $tone };
180 14         45 return $vowel;
181             }
182              
183 14     14   105 sub _vowel_without_tone { return $VOWELS{ $_[0] } }
184              
185             =head2 romanize_consonant
186              
187             Overrides L to access
188             module-local data.
189              
190             =cut
191              
192             sub romanize_consonant {
193 36     36 1 80 my (undef, $cons, $position) = @_;
194 36         88 my $consdata = $CONSONANTS{ $cons };
195 36 100       117 return ref $consdata ? $consdata->[$position] : $consdata;
196             }
197              
198             1;
199