File Coverage

blib/lib/Lingua/KO/Munja.pm
Criterion Covered Total %
statement 63 67 94.0
branch 5 8 62.5
condition n/a
subroutine 10 10 100.0
pod 2 6 33.3
total 80 91 87.9


line stmt bran cond sub pod time code
1             package Lingua::KO::Munja;
2 2     2   69737 use warnings;
  2         10  
  2         68  
3 2     2   11 use strict;
  2         3  
  2         187  
4             require Exporter;
5             our @ISA = qw(Exporter);
6             our @EXPORT_OK = qw/roman2hangul hangul2roman/;
7             our %EXPORT_TAGS = (
8             all => \@EXPORT_OK,
9             );
10             our $VERSION = '0.08';
11 2     2   940 use Convert::Moji 'make_regex';
  2         4110  
  2         1787  
12              
13             my $verbose;
14              
15             sub makearegex
16             {
17 6     6 0 21 my @possibles = @_;
18 6         16 @possibles = map {$_ =~ s/^-$//; $_} @possibles;
  136         171  
  136         205  
19 6         23 make_regex (@possibles);
20             }
21              
22             my @initial = qw(
23             g kk n d tt r m b pp s ss - j jj
24             ch k t p h
25             );
26              
27             my $initial_re = makearegex (@initial);
28              
29             my %initial = a2h (@initial);
30              
31             my @peak = qw(
32             a ae ya yae eo e yeo ye o wa wae oe yo u
33             wo we wi yu eu ui i
34             );
35              
36             my $peak_re = makearegex (@peak);
37              
38             my %peak = a2h (@peak);
39              
40             my @final = qw(
41             - g kk ks n nj nh d l lg lm lb ls lt
42             lp lh m b ps s ss ng j c k t p h
43             );
44              
45             my $final_re = makearegex (@final);
46              
47             my %final = a2h (@final);
48              
49             sub hangul
50             {
51 17     17 0 54 my ($initial, $peak, $final) = @_;
52 17         35 for ($initial, $peak, $final) {
53 51 100       90 if (! $_) {
54 15         24 $_ = '-';
55             }
56             }
57 17 50       33 if ($verbose) {
58 0         0 print "Initial = $initial, peak = $peak, final = $final\n";
59 0         0 print "Initial = $initial{$initial}, peak = $peak{$peak}, final = $final{$final}\n";
60             }
61 17         54 my $x = (($initial{$initial} * 21) + $peak{$peak}) * 28 + $final{$final};
62 17         34 my $hangul = chr (0xAC00 + $x);
63 17         48 return $hangul;
64             }
65              
66             sub roman2hangul
67             {
68 6     6 1 13747 my ($input) = @_;
69 6         21 my $match = "$initial_re$peak_re$final_re";
70 6         16 $match =~ s/\\-//g;
71 6         274 while ($input =~ s/((?:$match)+)/ROMAN/) {
72 7         28 my $i = $1;
73 7 50       21 if ($verbose) {
74 0         0 print "Looking at '$i' from '$input'.\n";
75             }
76 7         26 my @syllables;
77 7         255 while ($i =~ s/($match)$//g) {
78 17 50       44 if ($verbose) {
79 0         0 print "pushing $1\n";
80             }
81 17         98 unshift @syllables, $1;
82             }
83 7         12 my @hangul;
84 7         16 for my $s (@syllables) {
85 17         24 my $h = $s;
86 17         261 $h =~ s/^$match$/hangul ($1, $2, $3)/ge;
  17         44  
87 17         49 push @hangul, $h;
88             }
89 7         16 my $output = join '', @hangul;
90 7         66 $input =~ s/ROMAN/$output/;
91             }
92 6         29 return $input;
93             }
94              
95             # Given an array, make a hash with the elements as keys and a unique
96             # number as values.
97              
98             sub a2h
99             {
100 6     6 0 24 my @array = @_;
101 6         36 my %hash;
102 6         8 my $count = 0;
103 6         13 for my $k (@array) {
104 136         195 $hash{$k} = $count;
105 136         174 $count++;
106             }
107 6         69 return %hash;
108             }
109              
110             sub romanize
111             {
112 16     16 0 35 my ($char) = @_;
113 16         23 my $han = ord ($char) - 0xAC00;
114 16         32 my $init = int ($han / (21 * 28));
115 16         19 my $peak = int ($han / 28) % 21;
116 16         28 my $final = $han % 28;
117 16         31 my $roman = join '', $initial[$init], $peak[$peak], $final[$final];
118 16         53 return $roman;
119             }
120              
121             sub hangul2roman
122             {
123 5     5 1 1525 my ($hangul) = @_;
124 2     2   649 $hangul =~ s/(\p{Hangul})/romanize ($1)/ge;
  2         17  
  2         31  
  5         34  
  16         29  
125 5         33 $hangul =~ s/-//g;
126 5         18 return $hangul;
127             }
128              
129             1;
130