Skip to content

Instantly share code, notes, and snippets.

@mwgamera
Created October 28, 2024 21:41
Show Gist options
  • Save mwgamera/861ed67500ca685d3c97e3a7dfc7034a to your computer and use it in GitHub Desktop.
Save mwgamera/861ed67500ca685d3c97e3a7dfc7034a to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
# ๐‘‘๐‘ป๐‘ฏ ๐‘–๐‘ฑ๐‘๐‘พ๐‘ฏ ๐‘ข๐‘ป๐‘›๐‘Ÿ ๐‘ณ๐‘๐‘•๐‘ฒ๐‘› ๐‘›๐‘ฌ๐‘ฏ
# klg, ๐‘ช๐‘’๐‘‘ 2024
use strict;
use utf8;
use open qw/:std :utf8/;
use Carp;
use Getopt::Std;
# 43-๐‘ค๐‘ง๐‘‘๐‘ผ ๐‘–๐‘ฑ๐‘๐‘พ๐‘ฏ ๐‘จ๐‘ค๐‘“๐‘ฉ๐‘š๐‘ง๐‘‘:
# ๐‘ ๐‘š ๐‘‘ ๐‘› ๐‘’ ๐‘œ ๐‘“ ๐‘ ๐‘” ๐‘ž ๐‘• ๐‘Ÿ ๐‘– ๐‘  ๐‘— ๐‘ก ๐‘˜ ๐‘ข ๐‘™ ๐‘ฃ ๐‘ค ๐‘ฎ ๐‘ฅ ๐‘ฏ ๐‘ฆ ๐‘ฐ ๐‘ง ๐‘ฑ ๐‘จ ๐‘ฒ ๐‘ฉ ๐‘ณ ๐‘ช ๐‘ด ๐‘ซ ๐‘ต ๐‘ฌ ๐‘ถ ๐‘ญ ๐‘ท ๎œช ๎œซ ๐‘พ
# ๐‘š ๐‘ ๐‘› ๐‘‘ ๐‘œ ๐‘’ ๐‘ ๐‘“ ๐‘ž ๐‘” - - ๐‘  ๐‘– ๐‘ก ๐‘— - - ๐‘ฃ ๐‘™ ๐‘ฎ ๐‘ค ๐‘ฅ ๐‘ฏ ๐‘ฆ ๐‘ฐ ๐‘ช - ๐‘ฉ - ๐‘จ - ๐‘ง ๐‘ด ๐‘ต ๐‘ซ ๐‘ถ ๐‘ฌ ๐‘ญ ๐‘ท - - -
# ๐‘• ๐‘Ÿ ๐‘˜ ๐‘ข - ๐‘ž๐‘ฐ๐‘Ÿ 4 ๐‘•๐‘‘๐‘ฑ ๐‘ž ๐‘•๐‘ฑ๐‘ฅ, ๐‘š๐‘ณ๐‘‘ ๐‘ธ ๐‘ฅ๐‘ฆ๐‘•๐‘๐‘ค๐‘ฑ๐‘•๐‘‘
# 48-๐‘ค๐‘ง๐‘‘๐‘ผ ยท๐‘จ๐‘ฏ๐‘›๐‘ฎ๐‘ฉ๐‘’๐‘ค๐‘ฐ๐‘Ÿ ๐‘๐‘ป๐‘ ๐‘ฉ๐‘ฏ (-a):
# ๐‘ ๐‘š ๐‘‘ ๐‘› ๐‘’ ๐‘œ ๐‘“ ๐‘ ๐‘” ๐‘ž ๐‘• ๐‘Ÿ ๐‘– ๐‘  ๐‘— ๐‘ก ๐‘˜ ๐‘ข ๐‘™ ๐‘ฃ ๐‘ค ๐‘ฎ ๐‘ฅ ๐‘ฏ ๐‘ฆ ๐‘ฐ ๐‘ง ๐‘ฑ ๐‘จ ๐‘ฒ ๐‘ฉ ๐‘ณ ๐‘ช ๐‘ด ๐‘ซ ๐‘ต ๐‘ฌ ๐‘ถ ๐‘ญ ๐‘ท ๐‘ธ ๐‘น ๐‘บ ๐‘ป ๐‘ผ ๐‘ฝ ๐‘พ ๐‘ฟ
# ๐‘š ๐‘ ๐‘› ๐‘‘ ๐‘œ ๐‘’ ๐‘ ๐‘“ ๐‘ž ๐‘” - - ๐‘  ๐‘– ๐‘ก ๐‘— - - ๐‘ฃ ๐‘™ ๐‘ฎ ๐‘ค ๐‘ฅ ๐‘ฏ ๐‘ฆ ๐‘ฐ ๐‘ช - ๐‘ฉ - ๐‘จ - ๐‘ง ๐‘ด ๐‘ต ๐‘ซ ๐‘ถ ๐‘ฌ ๐‘ญ ๐‘ท - - - - - - - -
my %flip = map {((split//)[0,-1,-1,0])} ' ',
qw(๐‘๐‘š ๐‘‘๐‘› ๐‘’๐‘œ ๐‘“๐‘ ๐‘”๐‘ž ๐‘–๐‘  ๐‘—๐‘ก ๐‘™๐‘ฃ ๐‘ค๐‘ฎ ๐‘ฅ ๐‘ฏ ๐‘ฆ ๐‘ฐ ๐‘ง๐‘ช ๐‘จ๐‘ฉ ๐‘ด ๐‘ต๐‘ซ ๐‘ถ๐‘ฌ ๐‘ญ ๐‘ท - /);
my %misplaced = qw(๐‘• ๐‘• ๐‘Ÿ ๐‘Ÿ ๐‘˜ ๐‘˜ ๐‘ข ๐‘ข);
return 1 unless __FILE__ eq $0;
getopts('aehmiq', \our %opt) or die;
exit print << "END" if $opt{h};
$0 [๐‘ช๐‘๐‘–๐‘ฉ๐‘ฏ๐‘Ÿ] ...
-a ๐‘›๐‘ด๐‘ฏ๐‘‘ ๐‘•๐‘๐‘ค๐‘ฆ๐‘‘ ยท๐‘จ๐‘ฏ๐‘›๐‘ฎ๐‘ฉ๐‘’๐‘ค๐‘ฐ๐‘Ÿ ๐‘’๐‘ฉ๐‘ฅ๐‘๐‘ฌ๐‘ฏ๐‘›๐‘Ÿ
-e ๐‘๐‘ฎ๐‘ฆ๐‘ฏ๐‘‘ ๐‘ด๐‘ฏ๐‘ค๐‘ฆ ๐‘ข๐‘ป๐‘›๐‘Ÿ ๐‘ž๐‘จ๐‘‘ ๐‘ฎ๐‘ฐ๐‘› ๐‘ž ๐‘•๐‘ฑ๐‘ฅ
-h ๐‘–๐‘ด ๐‘ž๐‘ฆ๐‘• ๐‘ฃ๐‘ง๐‘ค๐‘
-m ๐‘ฅ๐‘ฆ๐‘•๐‘๐‘ค๐‘ฑ๐‘•๐‘‘ ๐‘ด๐‘’๐‘ฑ
-i ๐‘ฟ๐‘Ÿ ยท๐‘ฆ๐‘ฏ๐‘‘๐‘ผ ๐‘ฑ๐‘ค๐‘พ ๐‘ฆ๐‘ฏ๐‘’๐‘ด๐‘›๐‘ฆ๐‘™
-q ๐‘’๐‘ข๐‘ฒ๐‘ฉ๐‘‘
END
while (<<>>) {
chomp;
eval {
my $ft = shaw_flip($_, %opt);
printf "%s\n", $ft if $ft eq $_ or not $opt{e};
};
warn $@ if $@ and not $opt{q};
}
sub shaw_flip {
my ($str, %opt) = @_;
my %f = %flip;
%f= (%f, %misplaced) if $opt{m};
$str = ucs_denorm($str) unless $opt{a};
$str = join('', reverse
map {$f{$_} // croak "๐‘ฏ๐‘ช๐‘‘ ๐‘ฆ๐‘ฏ๐‘๐‘ป๐‘‘๐‘ฉ๐‘š๐‘ฉ๐‘ค: $_"}
split //, $str);
return ucs_norm($str, %opt);
}
sub ucs_norm {
(local $_, my %opt) = @_;
s/๎œช๐‘ฎ/๐‘บ/g; s/๎œซ๐‘ฎ/๐‘ป/g;
s/๐‘ญ๐‘ฎ/๐‘ธ/g; s/๐‘ท๐‘ฎ/๐‘น/g;
s/๐‘พ๐‘ฎ/๐‘ฝ/g; s/๐‘ฉ๐‘ฎ/๐‘ผ/g;
s/๐‘˜๐‘ต/๐‘ฟ/g;
s/๎œช/๐‘บ\x{fe00}/g, s/๎œซ/๐‘ป\x{fe00}/g if $opt{i};
croak "๐‘ณ๐‘ฏ๐‘ฆ๐‘’๐‘•๐‘๐‘ง๐‘’๐‘‘๐‘ฉ๐‘› ๐‘๐‘ฎ๐‘ฒ๐‘๐‘ฉ๐‘‘-๐‘ฟ๐‘• ๐‘’๐‘จ๐‘ฎ๐‘ฉ๐‘’๐‘‘๐‘ผ" if /[\x{e000}-\x{f8ff}]/;
return $_;
}
sub ucs_denorm {
local $_ = shift;
s/๐‘บ/๎œช๐‘ฎ/g; s/๐‘ป/๎œซ๐‘ฎ/g;
s/๐‘ธ/๐‘ญ๐‘ฎ/g; s/๐‘น/๐‘ท๐‘ฎ/g;
s/๐‘ฝ/๐‘พ๐‘ฎ/g; s/๐‘ผ/๐‘ฉ๐‘ฎ/g;
s/๐‘ฟ/๐‘˜๐‘ต/g;
s/๐‘บ\x{fe00}/๎œช/g; # ยท๐‘ฆ๐‘ฏ๐‘‘๐‘ผ ๐‘ฑ๐‘ค๐‘พ ๐‘ฆ๐‘’๐‘•๐‘‘๐‘ง๐‘ฏ๐‘–๐‘ฉ๐‘ฏ๐‘Ÿ
s/๐‘ป\x{fe00}/๎œซ/g;
croak "๐‘ณ๐‘ฏ๐‘ฆ๐‘’๐‘•๐‘๐‘ง๐‘’๐‘‘๐‘ฉ๐‘› ๐‘๐‘บ๐‘พ๐‘ฏ๐‘‘ ๐‘•๐‘ฆ๐‘ค๐‘ง๐‘’๐‘‘๐‘ผ" if /\x{fe00}/;
return $_;
}
1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment