/usr/local/CPAN/Convert-Braille/Convert/Braille/Ethiopic.pm
package Convert::Braille::Ethiopic;
use utf8;
BEGIN
{
require 5.006;
use base qw(Exporter);
use strict;
use vars qw( @EXPORT @EXPORT_OK $VERSION
%EthiopicToBrailleUnicode %BrailleUnicodeToEthiopic
%EthiopicNumeralsToBrailleUnicode %BrailleUnicodeToEthiopicNumerals
%EthiopicPunctuationToBrailleUnicode %BrailleUnicodeToEthiopicPunctuation
@EthiopicForms %EthiopicForms $n
);
use Convert::Braille qw(
%BrailleAsciiToUnicode
brailleAsciiToUnicode
brailleDotsToUnicode
brailleUnicodeToAscii
brailleUnicodeToDots
);
$VERSION = 0.02;
@EXPORT = qw(
ethiopicToBrailleUnicode
ethiopicToBrailleAscii
ethiopicToBrailleDots
brailleAsciiToEthiopic
brailleDotsToEthiopic
brailleUnicodeToEthiopic
);
@EXPORT_OK = qw(
ethiopicToBrailleUnicode
ethiopicToBrailleAscii
ethiopicToBrailleDots
brailleAsciiToEthiopic
brailleDotsToEthiopic
brailleUnicodeToEthiopic
%EthiopicToBrailleUnicode %BrailleUnicodeToEthiopic
%EthiopicNumeralsToBrailleUnicode %BrailleUnicodeToEthiopicNumerals
%EthiopicPunctuationToBrailleUnicode %BrailleUnicodeToEthiopicPunctuation
@EthiopicForms
);
%EthiopicToBrailleUnicode =(
á
=> $BrailleAsciiToUnicode{H},
á => $BrailleAsciiToUnicode{L},
á => $BrailleAsciiToUnicode{H},
á => $BrailleAsciiToUnicode{M},
ᥠ=> $BrailleAsciiToUnicode{S},
á => $BrailleAsciiToUnicode{R},
áµ => $BrailleAsciiToUnicode{S},
á½ => $BrailleAsciiToUnicode{'%'},
á
=> $BrailleAsciiToUnicode{Q},
á => "$BrailleAsciiToUnicode{Q}$BrailleAsciiToUnicode{W}",
á => $BrailleAsciiToUnicode{Q},
á => "$BrailleAsciiToUnicode{Q}$BrailleAsciiToUnicode{W}",
ᥠ=> $BrailleAsciiToUnicode{B},
á => $BrailleAsciiToUnicode{V},
áµ => $BrailleAsciiToUnicode{T},
á½ => $BrailleAsciiToUnicode{'*'},
á
=> $BrailleAsciiToUnicode{H},
á => "$BrailleAsciiToUnicode{H}$BrailleAsciiToUnicode{W}",
á => $BrailleAsciiToUnicode{N},
á => $BrailleAsciiToUnicode{'+'},
ᥠ=> $BrailleAsciiToUnicode{'('},
á => $BrailleAsciiToUnicode{K},
áµ => "$BrailleAsciiToUnicode{K}$BrailleAsciiToUnicode{W}",
á½ => $BrailleAsciiToUnicode{8},
á
=> "$BrailleAsciiToUnicode{8}$BrailleAsciiToUnicode{W}",
á => $BrailleAsciiToUnicode{W},
á => $BrailleAsciiToUnicode{'('},
á => $BrailleAsciiToUnicode{Z},
ᥠ=> $BrailleAsciiToUnicode{0},
á => $BrailleAsciiToUnicode{Y},
áµ => $BrailleAsciiToUnicode{D},
á½ => $BrailleAsciiToUnicode{D},
á
=> $BrailleAsciiToUnicode{J},
á => $BrailleAsciiToUnicode{G},
á => "$BrailleAsciiToUnicode{G}$BrailleAsciiToUnicode{W}",
á => $BrailleAsciiToUnicode{G},
ᥠ=> $BrailleAsciiToUnicode{')'},
á => $BrailleAsciiToUnicode{C},
áµ => $BrailleAsciiToUnicode{6},
á½ => $BrailleAsciiToUnicode{'&'},
á
=> $BrailleAsciiToUnicode{'&'},
á => $BrailleAsciiToUnicode{F},
á => $BrailleAsciiToUnicode{P},
á => "$BrailleAsciiToUnicode{R}$BrailleAsciiToUnicode{Y}$BrailleAsciiToUnicode{A}",
á => "$BrailleAsciiToUnicode{M}$BrailleAsciiToUnicode{Y}$BrailleAsciiToUnicode{A}",
á => "$BrailleAsciiToUnicode{F}$BrailleAsciiToUnicode{Y}$BrailleAsciiToUnicode{A}",
á§ => "$BrailleAsciiToUnicode{'\"'}$BrailleAsciiToUnicode{'('}"
);
foreach ( sort keys %EthiopicToBrailleUnicode ) {
next if ( exists($BrailleUnicodeToEthiopic{$EthiopicToBrailleUnicode{$_}}) );
$BrailleUnicodeToEthiopic{$EthiopicToBrailleUnicode{$_}} = $_;
}
@EthiopicForms = (
$BrailleAsciiToUnicode{5},
$BrailleAsciiToUnicode{U},
$BrailleAsciiToUnicode{I},
$BrailleAsciiToUnicode{A},
$BrailleAsciiToUnicode{E},
"",
$BrailleAsciiToUnicode{O},
"$BrailleAsciiToUnicode{W}$BrailleAsciiToUnicode{A}"
);
%EthiopicForms = (
$BrailleAsciiToUnicode{5} => -5,
$BrailleAsciiToUnicode{U} => -4,
$BrailleAsciiToUnicode{I} => -3,
$BrailleAsciiToUnicode{A} => -2,
$BrailleAsciiToUnicode{E} => -1,
$BrailleAsciiToUnicode{O} => 1,
$BrailleAsciiToUnicode{W} => 2
);
%EthiopicNumeralsToBrailleUnicode = (
'á©' => $BrailleAsciiToUnicode{1},
'áª' => $BrailleAsciiToUnicode{2},
'á«' => $BrailleAsciiToUnicode{3},
'á¬' => $BrailleAsciiToUnicode{4},
'á' => $BrailleAsciiToUnicode{5},
'á®' => $BrailleAsciiToUnicode{6},
'á¯' => $BrailleAsciiToUnicode{7},
'á°' => $BrailleAsciiToUnicode{8},
'á±' => $BrailleAsciiToUnicode{9},
'á²' => "$BrailleAsciiToUnicode{1}$BrailleAsciiToUnicode{0}",
'á³' => "$BrailleAsciiToUnicode{2}$BrailleAsciiToUnicode{0}",
'á´' => "$BrailleAsciiToUnicode{3}$BrailleAsciiToUnicode{0}",
'áµ' => "$BrailleAsciiToUnicode{4}$BrailleAsciiToUnicode{0}",
'á¶' => "$BrailleAsciiToUnicode{5}$BrailleAsciiToUnicode{0}",
'á·' => "$BrailleAsciiToUnicode{6}$BrailleAsciiToUnicode{0}",
'á¸' => "$BrailleAsciiToUnicode{7}$BrailleAsciiToUnicode{0}",
'á¹' => "$BrailleAsciiToUnicode{8}$BrailleAsciiToUnicode{0}",
'áº' => "$BrailleAsciiToUnicode{9}$BrailleAsciiToUnicode{0}",
'á»' => "$BrailleAsciiToUnicode{1}$BrailleAsciiToUnicode{0}$BrailleAsciiToUnicode{0}",
'á¼' => "$BrailleAsciiToUnicode{1}$BrailleAsciiToUnicode{0}$BrailleAsciiToUnicode{0}$BrailleAsciiToUnicode{0}$BrailleAsciiToUnicode{0}"
);
foreach ( keys %EthiopicNumeralsToBrailleUnicode ) {
$BrailleUnicodeToEthiopicNumerals{$EthiopicNumeralsToBrailleUnicode{$_}} = $_;
}
%EthiopicPunctuationToBrailleUnicode = (
'á¡' => $BrailleAsciiToUnicode{2},
'á¢' => $BrailleAsciiToUnicode{4},
'á£' => $BrailleAsciiToUnicode{1},
'á¤' => $BrailleAsciiToUnicode{1}, # undefined in ethiopic
'á¥' => $BrailleAsciiToUnicode{1}, # undefined in ethiopic
'á¦' => $BrailleAsciiToUnicode{1}, # undefined in ethiopic
'á§' => $BrailleAsciiToUnicode{8}, # undefined in ethiopic
'á¨' => " ",
);
foreach ( keys %EthiopicPunctuationToBrailleUnicode ) {
next if ( exists($BrailleUnicodeToEthiopicPunctuation{$EthiopicPunctuationToBrailleUnicode{$_}}) );
$BrailleUnicodeToEthiopicPunctuation{$EthiopicPunctuationToBrailleUnicode{$_}} = $_;
}
require Convert::Number::Ethiopic;
$n = new Convert::Number::Ethiopic;
}
sub brailleUnicodeToEthiopic
{
return unless ( $_[0] );
my @chars = split ( //, $_[0] );
my $zemede_rabi = 0;
my ($base,$trans);
foreach ( @chars ) { # the á§ problem forces shifting
if ( exists($BrailleUnicodeToEthiopic{$_}) ) {
if (
$base && $base !~ /[á¥ááá]/ &&
$BrailleUnicodeToEthiopic{$_} eq 'á'
)
{
$base = 'á
' if ( $base eq 'á
' );
if ( $base =~ /[á
á
ááá½á]/ ) {
$base = chr(ord($base)+8);
}
else {
$zemede_rabi = 1;
$trans .= chr(ord($base)+$EthiopicForms{$_});
}
}
elsif ( $_ eq 'â ·' && $trans && $trans =~ /â $/ ) {
$trans =~ s/â $/á§/;
}
else {
$base = $BrailleUnicodeToEthiopic{$_};
}
}
elsif ( exists($EthiopicForms{$_}) ) {
$trans .= chr(ord($base)+$EthiopicForms{$_}) unless ( $zemede_rabi );
$base = undef;
$zemede_rabi = 0;
}
else {
if ( $base ) {
$trans .= $base;
$base = undef;
}
if ( exists($BrailleUnicodeToEthiopicNumerals{$_}) ) {
$trans .= $base.$BrailleUnicodeToEthiopicNumerals{$_};
}
elsif ( exists($BrailleUnicodeToEthiopicPunctuation{$_}) ) {
$trans .= $base.$BrailleUnicodeToEthiopicPunctuation{$_};
}
else {
# something rouge
$trans .= $_;
}
}
}
$trans .= $base if ( $base );
$trans;
}
sub ethiopicToBrailleUnicode
{
return unless ( $_[0] );
my @chars = split ( //, $_[0] );
my $trans;
#
# change to for loop
#
while ( $_ = shift @chars ) {
if ( exists($EthiopicToBrailleUnicode{$_}) ) {
$trans .= $EthiopicToBrailleUnicode{$_};
}
elsif ( /[á-á]/ ) {
my $uni = $_;
if ( $uni eq 'á§' ) {
$trans .= 'â â ·';
}
else {
my $addr = ord($uni);
my $form = ord($uni)%8;
my $sadis = chr( ord($uni)-$form+5 );
$trans .= $EthiopicToBrailleUnicode{$sadis}.$EthiopicForms[$form];
}
}
elsif ( /[á¡-á¨]/ ) {
$trans .= "$EthiopicPunctuationToBrailleUnicode{$_}";
}
elsif ( /[á©-á¼]/ ) {
my $number = $_;
my $c;
while ( @chars && (($c = shift @chars) =~ /[á©-á¼]/) ) {
$number .= $c;
}
unshift ( @chars, $c ) if ( $c ); # might have end of string
my $result = brailleAsciiToUnicode ( $n->convert ( $number ) );
$trans .= "$BrailleAsciiToUnicode{'#'}$result";
}
else {
#
# anything else should convert as per english rules (including
# guillemts => " ), do so when english module is ready
#
$trans .= $_;
}
}
$trans;
}
sub ethiopicToBrailleAscii
{
brailleUnicodeToAscii ( ethiopicToBrailleUnicode ( @_ ) );
}
sub ethiopicToBrailleDots
{
brailleUnicodeToDots ( ethiopicToBrailleUnicode ( @_ ) );
}
sub brailleAsciiToEthiopic
{
brailleUnicodeToEthiopic ( brailleAsciiToUnicode ( @_ ) );
}
sub brailleDotsToEthiopic
{
brailleUnicodeToEthiopic ( brailleDotsToUnicode ( @_ ) );
}
#########################################################
# Do not change this, Do not put anything below this.
# File must return "true" value at termination
1;
##########################################################
__END__
=head1 NAME
Convert::Braille::Ethiopic - Convert Between Braille Encodings.
=head1 SYNOPSIS
use Convert::Braille::Ethiopic;
print brailleAsciiToEthiopic ( "S5LAM" ), "\n";
print brailleDotsToEthiopic ( "234261231134" ), "\n";
=head1 REQUIRES
perl5.6.0 or later, L<Convert::Number::Ethiopic>
=head1 EXPORTS
=over 4
=item ethiopicToBrailleUnicode
=item ethiopicToBrailleAscii
=item ethiopicToBrailleDots
=item brailleAsciiToEthiopic
=item brailleDotsToEthiopic
=item brailleUnicodeToEthiopic
=back
=head1 COPYRIGHT
This module is free software; you can redistribute it and/or modify it under
the same terms as Perl itself.
=head1 BUGS
None presently known.
=head1 AUTHOR
Daniel Yacob, L<dyacob@cpan.org|mailto:dyacob@cpan.org>
=head1 SEE ALSO
L<Convert::Braille> L<Convert::Braille::English>
Included with this package:
examples/demo.pl examples/makeethiopic.pl
=cut