File Coverage

lib/UniGreek.pm
Criterion Covered Total %
statement 51 53 96.2
branch 10 14 71.4
condition 8 12 66.6
subroutine 10 10 100.0
pod 2 2 100.0
total 81 91 89.0


line stmt bran cond sub pod time code
1             package UniGreek;
2 3     3   70300 use utf8;
  3         8  
  3         24  
3 3     3   84 use strict;
  3         7  
  3         88  
4 3     3   27 use warnings;
  3         5  
  3         123  
5 3     3   16 use feature qw(:5.10);
  3         8  
  3         406  
6 3     3   3407 use Unicode::Normalize;
  3         8356  
  3         414  
7 3     3   26 use base qw(Exporter);
  3         8  
  3         22313  
8              
9             our @EXPORT_OK = qw(from_unigreek to_unigreek);
10              
11             our $VERSION="0.2";
12             our %unigreek_to_utf8;
13             our %utf8_to_unigreek;
14              
15             #see: http://www.typegreek.com/alphabet.key/
16             #see: http://www.mythfolklore.net/bibgreek/resources/typing.htm
17              
18             sub from_unigreek {
19 2     2 1 1499 my $str = $_[0];
20 2         37 my(@parts)= $str =~ /(\X)/go;
21              
22 2         6 my @output;
23 2         3 my $current_combination = "";
24              
25 2         3 my $c = "";
26 2         8 while(defined($c)){
27 32         42 $c = shift(@parts);
28 32   100     147 while(defined($c) && exists($unigreek_to_utf8{ $current_combination.$c })){
29 10         12 $current_combination.=$c;
30 10         47 $c = shift(@parts);
31             }
32 32 50       52 if($current_combination ne ""){
    0          
33 32         50 my $greek_utf8 = $unigreek_to_utf8{ $current_combination };
34 32 100       71 push @output,(defined($greek_utf8) ? $greek_utf8->[0] : $current_combination);
35            
36             #last char did not combine with current_combination
37 32 100       43 if(defined($c)){
38 30         69 $current_combination = $c;
39             }else{
40 2         7 $current_combination = "";
41             }
42             }elsif(defined($c)){
43 0         0 push @output,$c;
44             }
45             }
46 2 100 66     16 if(scalar(@output) && $output[-1] eq "σ"){
47 1         2 $output[-1] = "ς";
48             }
49 2         83 NFC(join("",@output));
50             }
51             sub to_unigreek {
52 2     2 1 1589 my $str = $_[0];
53 2     1   59 my(@chars)= $str =~ /(\X)/go;
  1         7  
  1         3  
  1         14  
54 2         23482 my @output;
55 2         6 for my $c(@chars){
56 32   66     95 push @output,($utf8_to_unigreek{$c} // $c);
57             }
58            
59 2 50 33     15 if(scalar(@output) && $output[-1] eq "ς"){
60 0         0 $output[-1] = "s";
61             }
62 2         16 join("",@output);
63             }
64              
65             BEGIN {
66 3     3   2413 %unigreek_to_utf8 = (
67             #format: "" => ["",""]
68             "a" => ["α",1],
69             #one
70             "a|" => ["ᾳ",1],
71             "a)" => ["ἀ",1],
72             "a(" => ["ἁ",1],
73             "a\\" => ["ὰ",1],
74             "a/" => ["ά",1],
75             "a=" => ["ᾶ",1],
76              
77             #two (often two or more combinations lead to the same letter)
78             "a\\|" => ["ᾲ",1],
79             "a|\\" => ["ᾲ",0],
80              
81             "a/|" => ["ᾴ",1],
82             "a|/" => ["ᾴ",0],
83              
84             "a)\\" => ["ἂ",1],
85             "a\\)" => ["ἂ",0],
86              
87             "a)/" => ["ἄ",1],
88             "a/)" => ["ἄ",0],
89              
90             "a(\\" => ["ἃ",1],
91             "a\\(" => ["ἃ",0],
92              
93             "a(/" => ["ἅ",1],
94             "a/(" => ["ἅ",0],
95              
96             "a)=" => ["ἆ",1],
97             "a=)" => ["ἆ",0],
98              
99             "a=)" => ["ἆ",0],
100             "a)=" => ["ἆ",1],
101              
102             "a(=" => ["ἇ",1],
103             "a=(" => ["ἇ",0],
104              
105             "a|)" => ["ᾀ",1],
106             "a)|" => ["ᾀ",0],
107              
108             "a(|" => ["ᾁ",1],
109             "a|(" => ["ᾁ",0],
110              
111             "a=|" => ["ᾷ",1],
112             "a|=" => ["ᾷ",0],
113              
114             #three
115             #ᾂ
116             "a)\\|" => ["ᾂ",1],
117             "a)|\\" => ["ᾂ",0],
118             "a\\|)" => ["ᾂ",0],
119             "a\\)|" => ["ᾂ",0],
120             "a|)\\" => ["ᾂ",0],
121             "a|\\)" => ["ᾂ",0],
122             #ᾄ
123             "a)/|" => ["ᾄ",1],
124             "a)|/" => ["ᾄ",0],
125             "a/)|" => ["ᾄ",0],
126             "a/|)" => ["ᾄ",0],
127             "a|/)" => ["ᾄ",0],
128             "a|)/" => ["ᾄ",0],
129              
130             #ᾃ
131             "a(\\|" => ["ᾃ",1],
132             "a(|\\" => ["ᾃ",0],
133             "a\\|(" => ["ᾃ",0],
134             "a\\(|" => ["ᾃ",0],
135             "a|(\\" => ["ᾃ",0],
136             "a|\\(" => ["ᾃ",0],
137             #ᾅ
138             "a(/|" => ["ᾅ",1],
139             "a(|/" => ["ᾅ",0],
140             "a/(|" => ["ᾅ",0],
141             "a/|(" => ["ᾅ",0],
142             "a|/(" => ["ᾅ",0],
143             "a|(/" => ["ᾅ",0],
144             #ᾆ
145             "a)=|" => ["ᾆ",1],
146             "a)|=" => ["ᾆ",0],
147             "a=)|" => ["ᾆ",0],
148             "a=|)" => ["ᾆ",0],
149             "a|=)" => ["ᾆ",0],
150             "a|)=" => ["ᾆ",0],
151             #ᾇ
152             "a(=|" => ["ᾇ",1],
153             "a(|=" => ["ᾇ",0],
154             "a=(|" => ["ᾇ",0],
155             "a=|(" => ["ᾇ",0],
156             "a|=(" => ["ᾇ",0],
157             "a|(=" => ["ᾇ",0],
158              
159             "b" => ["β",1],
160             "g" => ["γ",1],
161             "d" => ["δ",1],
162              
163             "e" => ["ε",1],
164             "e/" => ["έ",1],
165             "e\\" => ["ὲ",1],
166             "e)" => ["ἐ",1],
167             "e(" => ["ἑ",1],
168              
169             "e)\\" => ["ἒ",1],
170             "e\\)" => ["ἒ",0],
171              
172             "e)/" => ["ἔ",1],
173             "e/)" => ["ἔ",0],
174              
175             "e(\\" => ["ἓ",1],
176             "e\\(" => ["ἓ",0],
177              
178             "e(/" => ["ἕ",1],
179             "e/(" => ["ἕ",0],
180              
181             "z" => ["ζ",1],
182              
183             "h" => ["η",1],
184             #one
185             "h\\" => ["ὴ",1],
186             "h/" => ["ή",1],
187             "h)" => ["ἠ",1],
188             "h(" => ["ἡ",1],
189             "h=" => ["ῆ",1],
190             "h|" => ["ῃ",1],
191              
192             #two
193             "h)\\" => ["ἢ",1],
194             "h\\)" => ["ἢ",0],
195              
196             "h)/" => ["ἤ",1],
197             "h/)" => ["ἤ",0],
198              
199             "h(\\" => ["ἣ",1],
200             "h\\(" => ["ἣ",0],
201              
202             "h(/" => ["ἥ",1],
203             "h/(" => ["ἥ",0],
204              
205             "h)=" => ["ἦ",1],
206             "h=)" => ["ἦ",0],
207              
208             "h(=" => ["ἧ",1],
209             "h=(" => ["ἧ",0],
210              
211             "h|)" => ["ᾐ",1],
212             "h)|" => ["ᾐ",0],
213              
214             "h(|" => ["ᾑ",1],
215             "h|(" => ["ᾑ",0],
216              
217             "h=|" => ["ῇ",1],
218             "h|=" => ["ῇ",0],
219              
220             "h\\|" => ["ῂ",1],
221             "h|\\" => ["ῂ",0],
222              
223             "h/|" => ["ῄ",1],
224             "h|/" => ["ῄ",0],
225              
226             #three
227             #ᾒ
228             "h)\\|" => ["ᾒ",1],
229             "h)|\\" => ["ᾒ",0],
230             "h\\)|" => ["ᾒ",0],
231             "h\\|)" => ["ᾒ",0],
232             "h|)\\" => ["ᾒ",0],
233             "h|\\)" => ["ᾒ",0],
234             #ᾔ
235             "h)/|" => ["ᾔ",1],
236             "h)|/" => ["ᾔ",0],
237             "h/)|" => ["ᾔ",0],
238             "h/|)" => ["ᾔ",0],
239             "h|/)" => ["ᾔ",0],
240             "h|)/" => ["ᾔ",0],
241             #ᾓ
242             "h(\\|" => ["ᾓ",1],
243             "h(|\\" => ["ᾓ",0],
244             "h\\(|" => ["ᾓ",0],
245             "h\\|(" => ["ᾓ",0],
246             "h|\\(" => ["ᾓ",0],
247             "h|(\\" => ["ᾓ",0],
248             #ᾕ
249             "h(/|" => ["ᾕ",1],
250             "h(|/" => ["ᾕ",0],
251             "h/(|" => ["ᾕ",0],
252             "h/|(" => ["ᾕ",0],
253             "h|/(" => ["ᾕ",0],
254             "h|(/" => ["ᾕ",0],
255             #ᾖ
256             "h)=|" => ["ᾖ",1],
257             "h)|=" => ["ᾖ",0],
258             "h=)|" => ["ᾖ",0],
259             "h=|)" => ["ᾖ",0],
260             "h|=)" => ["ᾖ",0],
261             "h|)=" => ["ᾖ",0],
262             #ᾗ
263             "h(=|" => ["ᾗ",1],
264             "h(|=" => ["ᾗ",0],
265             "h=(|" => ["ᾗ",0],
266             "h=|(" => ["ᾗ",0],
267             "h|=(" => ["ᾗ",0],
268             "h|(=" => ["ᾗ",0],
269              
270             "q" => ["θ",1],
271              
272             "i" => ["ι",1],
273             #one
274             "i\\" => ["ὶ",1],
275             "i/" => ["ί",1],
276             "i(" => ["ἱ",1],
277             "i)" => ["ἰ",1],
278             "i=" => ["ῖ",1],
279             "i+" => ["ϊ",1],
280            
281             #two
282             "i)\\" => ["ἲ",1],
283             "i\\)" => ["ἲ",0],
284              
285             "i)/" => ["ἴ",1],
286             "i/)" => ["ἴ",0],
287              
288             "i(\\" => ["ἳ",1],
289             "i\\(" => ["ἳ",0],
290              
291             "i(/" => ["ἵ",1],
292             "i/(" => ["ἵ",0],
293              
294             "i)=" => ["ἶ",1],
295             "i=)" => ["ἶ",0],
296              
297             "i(=" => ["ἷ",1],
298             "i=(" => ["ἷ",0],
299              
300             "i+\\" => ["ῒ",0],
301             "i\\+" => ["ῒ",1],
302              
303             "i/+" => ["ΐ",1],
304             "i+/" => ["ΐ",0],
305              
306             "k" => ["κ",1],
307             "l" => ["λ",1],
308             "m" => ["μ",1],
309             "n" => ["ν",1],
310             "c" => ["ξ",1],
311              
312             "o" => ["ο",1],
313             "o\\" => ["ὸ",1],
314             "o/" => ["ό",1],
315             "o)" => ["ὀ",1],
316             "o(" => ["ὁ",1],
317              
318             "o)\\" => ["ὂ",1],
319             "o\\)" => ["ὂ",0],
320              
321             "o)/" => ["ὄ",1],
322             "o/)" => ["ὄ",0],
323              
324             "o(\\" => ["ὃ",1],
325             "o\\(" => ["ὃ",0],
326              
327             "o(/" => ["ὅ",1],
328             "o/(" => ["ὅ",0],
329              
330             "p" => ["π",1],
331             "r" => ["ρ",1],
332             "s" => ["σ",1],
333             #todo: s op einde van een string moet ς
334             "s." => ["ς.",0],
335             "s " => ["ς ",0],
336             "s," => ["ς,",0],
337             "s?" => ["ς;",0],
338             "s;" => ["ς·",0],
339             "s:" => ["ς·",0],
340              
341             #In standard beta code, a j represents a terminal sigma and an s represents a regular sigma. On TypeGreek, j and s are interchangeable.
342             "j" => ["ς",1],
343             "j." => ["ς.",1],
344             "j " => ["ς ",1],
345             "j," => ["ς,",1],
346             "j?" => ["ς;",1],
347             "j;" => ["ς·",1],
348             "j:" => ["ς·",1],
349              
350            
351             "t" => ["τ",1],
352              
353             "u" => ["υ",1],
354             #one
355             "u\\" => ["ὺ",1],
356             "u/" => ["ύ",1],
357             "u)" => ["ὐ",1],
358             "u(" => ["ὑ",1],
359             "u=" => ["ῦ",1],
360             #two
361             "u)\\" => ["ὒ",1],
362             "u\\)" => ["ὒ",0],
363              
364             "u)/" => ["ὔ",1],
365             "u/)" => ["ὔ",0],
366              
367             "u(\\" => ["ὓ",1],
368             "u\\(" => ["ὓ",0],
369              
370             "u(/" => ["ὕ",1],
371             "u/(" => ["ὕ",0],
372              
373             "u)=" => ["ὖ",1],
374             "u=)" => ["ὖ",0],
375              
376             "u(=" => ["ὗ",1],
377             "u=(" => ["ὗ",0],
378              
379             "f" => ["φ",1],
380             "x" => ["χ",1],
381             "y" => ["ψ",1],
382              
383             "w" => ["ω",1],
384             #one
385             "w\\" => ["ὼ",1],
386             "w/" => ["ώ",1],
387             "w)" => ["ὠ",1],
388             "w(" => ["ὡ",1],
389             "w=" => ["ῶ",1],
390             "w|" => ["ῳ",1],
391              
392             #two(TODO: omgekeerde richting)
393             "w)\\" => ["ὢ",1],
394             "w\\)" => ["ὢ",0],
395              
396             "w)/" => ["ὤ",1],
397             "w/)" => ["ὤ",0],
398              
399             "w(\\" => ["ὣ",1],
400             "w\\(" => ["ὣ",0],
401              
402             "w(/" => ["ὥ",1],
403             "w/(" => ["ὥ",0],
404              
405             "w)=" => ["ὦ",1],
406             "w=)" => ["ὦ",0],
407              
408             "w(=" => ["ὧ",1],
409             "w=(" => ["ὧ",],
410              
411             "w\\|" => ["ῲ",1],
412             "w|\\" => ["ῲ",0],
413              
414             "w/|" => ["ῴ",1],
415             "w|/" => ["ῴ",0],
416              
417             "w)|" => ["ᾠ",1],
418             "w|)" => ["ᾠ",0],
419              
420             "w(|" => ["ᾡ",1],
421             "w|(" => ["ᾡ",0],
422              
423             "w|=" => ["ῷ",1],
424             "w=|" => ["ῷ",0],
425              
426             #three
427             #ᾦ
428             "w)=|" => ["ᾦ",1],
429             "w)|=" => ["ᾦ",0],
430             "w=|)" => ["ᾦ",0],
431             "w|=)" => ["ᾦ",0],
432             "w=)|" => ["ᾦ",0],
433             "w=|)" => ["ᾦ",0],
434             #ᾧ
435             "w(=|" => ["ᾧ",1],
436             "w(|=" => ["ᾧ",0],
437             "w=|(" => ["ᾧ",0],
438             "w|=(" => ["ᾧ",0],
439             "w=(|" => ["ᾧ",0],
440             "w=|(" => ["ᾧ",0],
441              
442             "v" => ["ϝ",1],
443              
444             "A" => ["Α",1],
445             #one
446             "A\\" => ["Ὰ",1],
447             "A/" => ["Ά",1],
448             "A)" => ["Ἀ",1],
449             "A(" => ["Ἁ",1],
450             "A|" => ["ᾼ",1],
451              
452             #two
453             "A)\\" => ["Ἂ",1],
454             "A\\)" => ["Ἂ",0],
455              
456             "A)/" => ["Ἄ",1],
457             "A/)" => ["Ἄ",0],
458              
459             "A(\\" => ["Ἃ",1],
460             "A\\(" => ["Ἃ",0],
461              
462             "A(/" => ["Ἅ",1],
463             "A/(" => ["Ἅ",0],
464              
465             "A)=" => ["Ἆ",1],
466             "A=)" => ["Ἆ",0],
467              
468             "A(=" => ["Ἇ",1],
469             "A=(" => ["Ἇ",0],
470              
471             "A|)" => ["ᾈ",0],
472             "A)|" => ["ᾈ",1],
473              
474             "A(|" => ["ᾉ",1],
475             "A|(" => ["ᾉ",0],
476              
477             #three
478             #ᾊ
479             "A)\\|" => ["ᾊ",1],
480             "A)|\\" => ["ᾊ",0],
481             "A\\)|" => ["ᾊ",0],
482             "A\\|)" => ["ᾊ",0],
483             "A|)\\" => ["ᾊ",0],
484             "A|\\)" => ["ᾊ",0],
485             #ᾌ
486             "A)/|" => ["ᾌ",1],
487             "A)|/" => ["ᾌ",0],
488             "A/)|" => ["ᾌ",0],
489             "A/|)" => ["ᾌ",0],
490             "A|)/" => ["ᾌ",0],
491             "A|/)" => ["ᾌ",0],
492             #ᾋ
493             "A(\\|" => ["ᾋ",1],
494             "A(|\\" => ["ᾋ",0],
495             "A\\(|" => ["ᾋ",0],
496             "A\\|(" => ["ᾋ",0],
497             "A|\\(" => ["ᾋ",0],
498             "A|(\\" => ["ᾋ",0],
499             #ᾍ
500             "A(/|" => ["ᾍ",1],
501             "A(|/" => ["ᾍ",0],
502             "A/(|" => ["ᾍ",0],
503             "A/|(" => ["ᾍ",0],
504             "A|(/" => ["ᾍ",0],
505             "A|/(" => ["ᾍ",0],
506             #ᾎ
507             "A)=|" => ["ᾎ",1],
508             "A)|=" => ["ᾎ",0],
509             "A=)|" => ["ᾎ",0],
510             "A=|)" => ["ᾎ",0],
511             "A|=)" => ["ᾎ",0],
512             "A|)=" => ["ᾎ",0],
513              
514             #ᾏ
515             "A(=|" => ["ᾏ",1],
516             "A(|=" => ["ᾏ",0],
517             "A=(|" => ["ᾏ",0],
518             "A=|(" => ["ᾏ",0],
519             "A|=(" => ["ᾏ",0],
520             "A|(=" => ["ᾏ",0],
521              
522             "B" => ["Β",1],
523             "G" => ["Γ",1],
524             "D" => ["Δ",1],
525              
526             "E" => ["Ε",1],
527             #one
528             "E\\" => ["Ὲ",1],
529             "E/" => ["Έ",1],
530             "E)" => ["Ἐ",1],
531             "E(" => ["Ἑ",1],
532             #two
533             "E)\\" => ["Ἒ",1],
534             "E\\)" => ["Ἒ",0],
535              
536             "E)/" => ["Ἔ",1],
537             "E/)" => ["Ἔ",0],
538              
539             "E(\\" => ["Ἓ",1],
540             "E\\(" => ["Ἓ",0],
541              
542             "E(/" => ["Ἕ",1],
543             "E/(" => ["Ἕ",0],
544              
545             "Z" => ["Ζ",1],
546              
547             "H" => ["Η",1],
548             #one
549             "H)" => ["Ἠ",1],
550             "H(" => ["Ἡ",1],
551             "H\\" => ["Ὴ",1],
552             "H/" => ["Ή",1],
553             "H|" => ["ῌ",1],
554             #sorry no such thing..
555             #"H=" => ["",1],
556            
557             "H)\\" => ["Ἢ",1],
558             "H\\)" => ["Ἢ",0],
559              
560             "H)/" => ["Ἤ",1],
561             "H/)" => ["Ἤ",0],
562              
563             "H(\\" => ["Ἣ",1],
564             "H\\(" => ["Ἣ",0],
565              
566             "H(/" => ["Ἥ",1],
567             "H/(" => ["Ἥ",0],
568              
569             "H)=" => ["Ἦ",1],
570             "H=)" => ["Ἦ",0],
571              
572             "H(=" => ["Ἧ",1],
573             "H=(" => ["Ἧ",0],
574              
575             "H|)" => ["ᾘ",0],
576             "H)|" => ["ᾘ",1],
577              
578             "H(|" => ["ᾙ",1],
579             "H|(" => ["ᾙ",0],
580              
581             #three
582             #ᾚ
583             "H)\\|" => ["ᾚ",1],
584             "H)|\\" => ["ᾚ",0],
585             "H\\|)" => ["ᾚ",0],
586             "H\\)|" => ["ᾚ",0],
587             "H|)\\" => ["ᾚ",0],
588             "H|\\)" => ["ᾚ",0],
589             #ᾜ
590             "H)/|" => ["ᾜ",1],
591             "H)|/" => ["ᾜ",0],
592             "H/)|" => ["ᾜ",0],
593             "H/|)" => ["ᾜ",0],
594             "H|)/" => ["ᾜ",0],
595             "H|/)" => ["ᾜ",0],
596             #ᾛ
597             "H(\\|" => ["ᾛ",1],
598             "H(|\\" => ["ᾛ",0],
599             "H\\(|" => ["ᾛ",0],
600             "H\\|(" => ["ᾛ",0],
601             "H|\\(" => ["ᾛ",0],
602             "H|(\\" => ["ᾛ",0],
603             #ᾝ
604             "H(/|" => ["ᾝ",1],
605             "H(|/" => ["ᾝ",0],
606             "H/(|" => ["ᾝ",0],
607             "H/|(" => ["ᾝ",0],
608             "H|(/" => ["ᾝ",0],
609             "H|/(" => ["ᾝ",0],
610             #ᾞ
611             "H)=|" => ["ᾞ",1],
612             "H)|=" => ["ᾞ",0],
613             "H=|)" => ["ᾞ",0],
614             "H=)|" => ["ᾞ",0],
615             "H|=)" => ["ᾞ",0],
616             "H|)=" => ["ᾞ",0],
617              
618             #ᾟ
619             "H(=|" => ["ᾟ",1],
620             "H(|=" => ["ᾟ",0],
621             "H=(|" => ["ᾟ",0],
622             "H=|(" => ["ᾟ",0],
623             "H|(=" => ["ᾟ",0],
624             "H|=(" => ["ᾟ",0],
625              
626             "Q" => ["Θ",1],
627              
628             "I" => ["Ι",1],
629             #one
630             "I\\" => ["Ὶ",1],
631             "I/" => ["Ί",1],
632             "I)" => ["Ἰ",1],
633             "I(" => ["Ἱ",1],
634            
635             #two
636             "I)\\" => ["Ἲ",1],
637             "I\\)" => ["Ἲ",0],
638              
639             "I)/" => ["Ἴ",1],
640             "I/)" => ["Ἴ",0],
641              
642             "I(\\" => ["Ἳ",1],
643             "I\\(" => ["Ἳ",0],
644              
645             "I(/" => ["Ἵ",1],
646             "I/(" => ["Ἵ",0],
647              
648             "I)=" => ["Ἶ",1],
649             "I=)" => ["Ἶ",0],
650              
651             "I(=" => ["Ἷ",1],
652             "I=(" => ["Ἷ",0],
653              
654             "K" => ["Κ",1],
655             "L" => ["Λ",1],
656             "M" => ["Μ",1],
657             "N" => ["Ν",1],
658             "C" => ["Ξ",1],
659              
660             "O" => ["Ο",1],
661             #one
662             "O\\" => ["Ὸ",1],
663             "O/" => ["Ό",1],
664             "O)" => ["Ὀ",1],
665             "O(" => ["Ὁ",1],
666             #two
667             "O)\\" => ["Ὂ",1],
668             "O\\)" => ["Ὂ",0],
669              
670             "O)/" => ["Ὄ",1],
671             "O/)" => ["Ὄ",0],
672              
673             "O(\\" => ["Ὃ",1],
674             "O\\(" => ["Ὃ",0],
675              
676             "O(/" => ["Ὅ",1],
677             "O/(" => ["Ὅ",0],
678              
679             "P" => ["Π",1],
680             "R" => ["Ρ",1],
681             "S" => ["Σ",1],
682             "T" => ["Τ",1],
683              
684             "U" => ["Υ",1],
685             #one
686             "U\\" => ["Ὺ",1],
687             "U/" => ["Ύ",1],
688              
689             # 'U)' werk niet?
690             #"U)" => ["",1],
691              
692             "U(" => ["Ὑ",1],
693              
694             # 'U)' werk niet?
695             #"U)\\" => ["",1],
696             #"U)/" => ["",1],
697              
698             "U(\\" => ["Ὓ",1],
699             "U\\(" => ["Ὓ",0],
700              
701             "U(/" => ["Ὕ",1],
702             "U/(" => ["Ὕ",0],
703              
704             # 'U)' werk niet?
705             #"U)=" => ["",1],
706              
707             "U(=" => ["Ὗ",1],
708             "U=(" => ["Ὗ",0],
709              
710              
711             "F" => ["Φ",1],
712             "X" => ["Χ",1],
713             "Y" => ["Ψ",1],
714              
715             "W" => ["Ω",1],
716             #one
717             "W|" => ["ῼ",1],
718             "W\\" => ["Ὼ",1],
719             "W/" => ["Ώ",1],
720             "W)" => ["Ὠ",1],
721             "W(" => ["Ὡ",1],
722             #sorry
723             #"W=" => ["",1],
724              
725             #two
726             "W)\\" => ["Ὢ",1],
727             "W\\)" => ["Ὢ",0],
728              
729             "W)/" => ["Ὤ",1],
730             "W/)" => ["Ὤ",0],
731              
732             "W(\\" => ["Ὣ",1],
733             "W\\(" => ["Ὣ",0],
734              
735             "W(/" => ["Ὥ",1],
736             "W/(" => ["Ὥ",0],
737              
738             "W)=" => ["Ὦ",1],
739             "W=)" => ["Ὦ",0],
740              
741             "W(=" => ["Ὧ",1],
742             "W=(" => ["Ὧ",0],
743              
744             #three
745             # ᾪ
746             "W)|\\" => ["ᾪ",1],
747             "W)\\|" => ["ᾪ",0],
748             "W\\)|" => ["ᾪ",0],
749             "W\\|)" => ["ᾪ",0],
750             "W|)\\" => ["ᾪ",0],
751             "W|\\)" => ["ᾪ",0],
752              
753             # ᾬ
754             "W)/|" => ["ᾬ",1],
755             "W)|/" => ["ᾬ",0],
756             "W/)|" => ["ᾬ",0],
757             "W/|)" => ["ᾬ",0],
758             "W|/)" => ["ᾬ",0],
759             "W|)/" => ["ᾬ",0],
760              
761             # ᾫ
762             "W(\\|" => ["ᾫ",1],
763             "W(|\\" => ["ᾫ",0],
764             "W\\(|" => ["ᾫ",0],
765             "W\\|(" => ["ᾫ",0],
766             "W|\\(" => ["ᾫ",0],
767             "W|(\\" => ["ᾫ",0],
768              
769             # ᾭ
770             "W(/|" => ["ᾭ",1],
771             "W(|/" => ["ᾭ",0],
772             "W/(|" => ["ᾭ",0],
773             "W/|(" => ["ᾭ",0],
774             "W|/(" => ["ᾭ",0],
775             "W|(/" => ["ᾭ",0],
776              
777             # ᾮ
778             "W)=|" => ["ᾮ",1],
779             "W)=|" => ["ᾮ",0],
780             "W=)|" => ["ᾮ",0],
781             "W=|)" => ["ᾮ",0],
782             "W|=)" => ["ᾮ",0],
783             "W|)=" => ["ᾮ",0],
784              
785             # ᾯ
786             "W)=|" => ["ᾯ",1],
787             "W)=|" => ["ᾯ",0],
788             "W=)|" => ["ᾯ",0],
789             "W=|)" => ["ᾯ",0],
790             "W|=)" => ["ᾯ",0],
791             "W|)=" => ["ᾯ",0],
792              
793             "V" => ["Ϝ",1],
794             "," => [",",1],
795             "?" => [";",1],
796             ";" => ["·",1],
797             "." => [".",1],
798             ":" => ["·",1],
799             "|" => ["ͺ",1]
800             );
801              
802 3         895 for my $key(sort keys %unigreek_to_utf8){
803 1521 100       2861 next unless $unigreek_to_utf8{$key}->[1];
804 762         4392 $utf8_to_unigreek{ $unigreek_to_utf8{$key}->[0] } = $key;
805             }
806             }
807             =encoding utf-8
808              
809             =head1 NAME
810              
811             UniGreek - This module converts between an ascii-representation of polytonic Greek
812             (i.e. old Greek) and the utf8-representation.
813              
814             The ascii-representation is taken from typegreek.com (http://www.typegreek.com), a web-based
815             application, made by Randy Hoyt, that converts Roman lettercombination to Greek in utf8-format.
816              
817             =head1 SYNOPSIS
818              
819             use strict;
820             use utf8;
821             use feature qw(:5.10);
822             use UniGreek qw(from_unigreek to_unigreek);
823              
824             binmode STDOUT,":utf8";
825              
826             my $unigreek = "Mh=nin a)/eide qea/";
827             #result: Μῆνιν ἄειδε θεά
828             say UniGreek::from_unigreek($unigreek);
829              
830             my $utf8 = "Μῆνιν ἄειδε θεά";
831             #result: Mh=nin a)/eide qea/
832             say UniGreek::to_unigreek($utf8);
833              
834             =head1 METHODS
835              
836             =head2 from_unigreek()
837            
838             Converts from the ascii-representation to the real Greek letters in utf8.
839              
840             =head2 to_unigreek()
841              
842             Converts from the Greek letters in utf8 to the ascii-representation
843              
844             =head1 SEE ALSO
845              
846             L
847             L
848             L
849              
850             =cut
851             1;