UConv.pm: add unicode symbols for direction2compasspoint()

git-svn-id: https://svn.fhem.de/fhem/trunk@19757 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
jpawlowski 2019-07-01 14:45:01 +00:00
parent 19a40f21b5
commit d8e87cd479

View File

@ -30,131 +30,131 @@ sub _ReplaceStringByHashKey($$;$);
our %compasspoints = ( our %compasspoints = (
en => [ en => [
[ "North", "N" ], [ "North", "N", '▲' ],
[ "North-Northeast", "NNE" ], [ "North-Northeast", "NNE", '⬈' ],
[ "North-East", "NE" ], [ "North-East", "NE", '⬈' ],
[ "East-Northeast", "ENE" ], [ "East-Northeast", "ENE", '⬈' ],
[ "East", "E" ], [ "East", "E", '▶' ],
[ "East-Southeast", "ESE" ], [ "East-Southeast", "ESE", '⬊' ],
[ "Southeast", "SE" ], [ "Southeast", "SE", '⬊' ],
[ "South-Southeast", "SSE" ], [ "South-Southeast", "SSE", '⬊' ],
[ "South", "S" ], [ "South", "S", '▼' ],
[ "South-Southwest", "SSW" ], [ "South-Southwest", "SSW", '⬋' ],
[ "Southwest", "SW" ], [ "Southwest", "SW", '⬋' ],
[ "West-Southwest", "WSW" ], [ "West-Southwest", "WSW", '⬋' ],
[ "West", "W" ], [ "West", "W", '◀' ],
[ "West-Northwest", "WNW" ], [ "West-Northwest", "WNW", '⬉' ],
[ "Northwest", "NW" ], [ "Northwest", "NW", '⬉' ],
[ "North-Northwest", "NNW" ], [ "North-Northwest", "NNW", '⬉' ],
], ],
de => [ de => [
[ "Norden", "N" ], [ "Norden", "N", '▲' ],
[ "Nord-Nordost", "NNO" ], [ "Nord-Nordost", "NNO", '⬈' ],
[ "Nord-Ost", "NO" ], [ "Nord-Ost", "NO", '⬈' ],
[ "Ost-Nordost", "ONO" ], [ "Ost-Nordost", "ONO", '⬈' ],
[ "Ost", "O" ], [ "Ost", "O", '▶' ],
[ "Ost-Südost", "OSO" ], [ "Ost-Südost", "OSO", '⬊' ],
[ "Südost", "SO" ], [ "Südost", "SO", '⬊' ],
[ "Süd-Südost", "SSO" ], [ "Süd-Südost", "SSO", '⬊' ],
[ "Süd", "S" ], [ "Süd", "S", '▼' ],
[ "Süd-Südwest", "SSW" ], [ "Süd-Südwest", "SSW", '⬋' ],
[ "Südwest", "SW" ], [ "Südwest", "SW", '⬋' ],
[ "West-Südwest", "WSW" ], [ "West-Südwest", "WSW", '⬋' ],
[ "West", "W" ], [ "West", "W", '◀' ],
[ "West-Nordwest", "WNW" ], [ "West-Nordwest", "WNW", '⬉' ],
[ "Nordwest", "NW" ], [ "Nordwest", "NW", '⬉' ],
[ "Nord-Nordwest", "NNW" ], [ "Nord-Nordwest", "NNW", '⬉' ],
], ],
es => [ es => [
[ "Norte", "N" ], [ "Norte", "N", '▲' ],
[ "Norte-Noreste", "NNE" ], [ "Norte-Noreste", "NNE", '⬈' ],
[ "Noreste", "NE" ], [ "Noreste", "NE", '⬈' ],
[ "Este-Noreste", "ENE" ], [ "Este-Noreste", "ENE", '⬈' ],
[ "Este", "E" ], [ "Este", "E", '▶' ],
[ "Este-Sureste", "ESE" ], [ "Este-Sureste", "ESE", '⬊' ],
[ "Sureste", "SE" ], [ "Sureste", "SE", '⬊' ],
[ "Sur-Sureste", "SSE" ], [ "Sur-Sureste", "SSE", '⬊' ],
[ "Sur", "S" ], [ "Sur", "S", '▼' ],
[ "Sudoeste", "SDO" ], [ "Sudoeste", "SDO", '⬋' ],
[ "Sur-Oeste", "SO" ], [ "Sur-Oeste", "SO", '⬋' ],
[ "Oeste-Suroeste", "OSO" ], [ "Oeste-Suroeste", "OSO", '⬋' ],
[ "Oeste", "O" ], [ "Oeste", "O", '◀' ],
[ "Oeste-Noroeste", "ONO" ], [ "Oeste-Noroeste", "ONO", '⬉' ],
[ "Noroeste", "NO" ], [ "Noroeste", "NO", '⬉' ],
[ "Norte-Noroeste", "NNE" ], [ "Norte-Noroeste", "NNE", '⬉' ],
], ],
it => [ it => [
[ "Nord", "N" ], [ "Nord", "N", '▲' ],
[ "Nord-Nord-Est", "NNE" ], [ "Nord-Nord-Est", "NNE", '⬈' ],
[ "Nord-Est", "NE" ], [ "Nord-Est", "NE", '⬈' ],
[ "Est-Nord-Est", "ENE" ], [ "Est-Nord-Est", "ENE", '⬈' ],
[ "Est", "E" ], [ "Est", "E", '▶' ],
[ "Est-Sud-Est", "ESE" ], [ "Est-Sud-Est", "ESE", '⬊' ],
[ "Sud-Est", "SE" ], [ "Sud-Est", "SE", '⬊' ],
[ "Sud-Sud-Est", "SSE" ], [ "Sud-Sud-Est", "SSE", '⬊' ],
[ "Sud", "S" ], [ "Sud", "S", '▼' ],
[ "Sud-Sud-Ovest", "SSO" ], [ "Sud-Sud-Ovest", "SSO", '⬋' ],
[ "Sud-Ovest", "SO" ], [ "Sud-Ovest", "SO", '⬋' ],
[ "Ovest-Sud-Ovest", "OSO" ], [ "Ovest-Sud-Ovest", "OSO", '⬋' ],
[ "Ovest", "O" ], [ "Ovest", "O", '◀' ],
[ "Ovest-Nord-Ovest", "ONO" ], [ "Ovest-Nord-Ovest", "ONO", '⬉' ],
[ "Nord-Ovest", "NO" ], [ "Nord-Ovest", "NO", '⬉' ],
[ "Nord-Nord-Ovest", "NNO" ], [ "Nord-Nord-Ovest", "NNO", '⬉' ],
], ],
nl => [ nl => [
[ "Noorden", "N" ], [ "Noorden", "N", '▲' ],
[ "Noord-Noordoosten", "NNO" ], [ "Noord-Noordoosten", "NNO", '⬈' ],
[ "Noordoosten", "NO" ], [ "Noordoosten", "NO", '⬈' ],
[ "Oost-Noordoost", "ONO" ], [ "Oost-Noordoost", "ONO", '⬈' ],
[ "Oosten", "O" ], [ "Oosten", "O", '▶' ],
[ "Oost-Zuidoost", "OZO" ], [ "Oost-Zuidoost", "OZO", '⬊' ],
[ "Zuidoosten", "ZO" ], [ "Zuidoosten", "ZO", '⬊' ],
[ "Zuid-Zuidoost", "ZZO" ], [ "Zuid-Zuidoost", "ZZO", '⬊' ],
[ "Zuiden", "Z" ], [ "Zuiden", "Z", '▼' ],
[ "Zuid-Zuidwest", "ZZW" ], [ "Zuid-Zuidwest", "ZZW", '⬋' ],
[ "Zuidwest", "ZW" ], [ "Zuidwest", "ZW", '⬋' ],
[ "West-Zuidwest", "WZW" ], [ "West-Zuidwest", "WZW", '⬋' ],
[ "West", "W" ], [ "West", "W", '◀' ],
[ "West-Noord-West", "WNW" ], [ "West-Noord-West", "WNW", '⬉' ],
[ "Noord-West", "NW" ], [ "Noord-West", "NW", '⬉' ],
[ "Noord-Noord-West", "NNW" ], [ "Noord-Noord-West", "NNW", '⬉' ],
], ],
fr => [ fr => [
[ "Nord", "N" ], [ "Nord", "N", '▲' ],
[ "Nord-Nord-Est", "NNE" ], [ "Nord-Nord-Est", "NNE", '⬈' ],
[ "Nord-Est", "NE" ], [ "Nord-Est", "NE", '⬈' ],
[ "Est-Nord-Est", "ENE" ], [ "Est-Nord-Est", "ENE", '⬈' ],
[ "Est", "E" ], [ "Est", "E", '▶' ],
[ "Est-Sud-Est", "ESE" ], [ "Est-Sud-Est", "ESE", '⬊' ],
[ "Sud-Est", "SE" ], [ "Sud-Est", "SE", '⬊' ],
[ "Sud-Sud-Est", "SSE" ], [ "Sud-Sud-Est", "SSE", '⬊' ],
[ "Sud", "S" ], [ "Sud", "S", '▼' ],
[ "Sud-Sud-Ouest", "SSW" ], [ "Sud-Sud-Ouest", "SSW", '⬋' ],
[ "Sud-Ouest", "SW" ], [ "Sud-Ouest", "SW", '⬋' ],
[ "Ouest-Sud-Ouest", "OSO" ], [ "Ouest-Sud-Ouest", "OSO", '⬋' ],
[ "Ouest", "O" ], [ "Ouest", "O", '◀' ],
[ "Ouest-Nord-Ouest", "ONO" ], [ "Ouest-Nord-Ouest", "ONO", '⬉' ],
[ "Nord-Ouest", "NO" ], [ "Nord-Ouest", "NO", '⬉' ],
[ "Nord-Nord-Ouest", "NNO" ], [ "Nord-Nord-Ouest", "NNO", '⬉' ],
], ],
pl => [ pl => [
[ "Północ", "N" ], [ "Północ", "N", '▲' ],
[ "Północny-Północny-Wschód", "NNE" ], [ "Północny-Północny-Wschód", "NNE", '⬈' ],
[ "Północny-Wschód", "NE" ], [ "Północny-Wschód", "NE", '⬈' ],
[ "Wschód-Północny-Wschód", "ENE" ], [ "Wschód-Północny-Wschód", "ENE", '⬈' ],
[ "Wschód", "E" ], [ "Wschód", "E", '▶' ],
[ "Wschód-Południowy-Wschód", "ESE" ], [ "Wschód-Południowy-Wschód", "ESE", '⬊' ],
[ "Południowy-Południowy-Wschód", "SE" ], [ "Południowy-Południowy-Wschód", "SE", '⬊' ],
[ "Południowy-Wschód", "SSE" ], [ "Południowy-Wschód", "SSE", '⬊' ],
[ "Południe", "S" ], [ "Południe", "S", '▼' ],
[ "Południowo-Południowy-Zachód", "SSW" ], [ "Południowo-Południowy-Zachód", "SSW", '⬋' ],
[ "Południowy-Zachód", "SW" ], [ "Południowy-Zachód", "SW", '⬋' ],
[ "Zachód-Południowy-Zachód", "WSW" ], [ "Zachód-Południowy-Zachód", "WSW", '⬋' ],
[ "Zachód", "W" ], [ "Zachód", "W", '◀' ],
[ "Zachód-Północny-Zachód", "WNW" ], [ "Zachód-Północny-Zachód", "WNW", '⬉' ],
[ "Północny-Zachód", "NW" ], [ "Północny-Zachód", "NW", '⬉' ],
[ "Północno-Północny-Zachód", "NNW" ], [ "Północno-Północny-Zachód", "NNW", '⬉' ],
], ],
); );
@ -193,53 +193,31 @@ our %hr_formats = (
### lang ref ### ### lang ref ###
# #
en => { en => { ref => "std", },
ref => "std",
},
de => { de => { ref => "std-fr", },
ref => "std-fr",
},
de_at => { de_at => {
ref => "std-fr", ref => "std-fr",
min => 4, min => 4,
}, },
de_ch => { de_ch => { ref => "std", },
ref => "std",
},
nl => { nl => { ref => "std-fr", },
ref => "std-fr",
},
fr => { fr => { ref => "std-fr", },
ref => "std-fr",
},
pl => { pl => { ref => "std-fr", },
ref => "std-fr",
},
### number ref ### ### number ref ###
# #
0 => { 0 => { ref => "std", },
ref => "std", 1 => { ref => "std-fr", },
}, 2 => { ref => "old-english", },
1 => { 3 => { ref => "old-european", },
ref => "std-fr", 4 => { ref => "ch", },
},
2 => {
ref => "old-english",
},
3 => {
ref => "old-european",
},
4 => {
ref => "ch",
},
5 => { 5 => {
ref => "std-fr", ref => "std-fr",
min => 4, min => 4,
@ -807,7 +785,7 @@ sub mi2km($;$) {
sub direction2compasspoint($;$$) { sub direction2compasspoint($;$$) {
my ( $deg, $txt, $lang ) = @_; my ( $deg, $txt, $lang ) = @_;
my $i = floor( ( ( $deg + 11.25 ) % 360 ) / 22.5 ); my $i = floor( ( ( $deg + 11.25 ) % 360 ) / 22.5 );
return $i if ( defined($txt) && $txt == 0. ); return $i if (!wantarray && defined($txt) && $txt == 0. );
my $directions_txt_i18n; my $directions_txt_i18n;
$lang = main::AttrVal( "global", "language", "EN" ) unless ($lang); $lang = main::AttrVal( "global", "language", "EN" ) unless ($lang);
@ -818,6 +796,13 @@ sub direction2compasspoint($;$$) {
else { else {
$directions_txt_i18n = $compasspoints{en}; $directions_txt_i18n = $compasspoints{en};
} }
return (
$directions_txt_i18n->[$i][0],
$directions_txt_i18n->[$i][1],
$directions_txt_i18n->[$i][2]
) if wantarray;
return $directions_txt_i18n->[$i][2] if ( $txt && $txt == 3. );
return $directions_txt_i18n->[$i][0] if ( $txt && $txt == 2. ); return $directions_txt_i18n->[$i][0] if ( $txt && $txt == 2. );
return $directions_txt_i18n->[$i][1]; return $directions_txt_i18n->[$i][1];
} }
@ -993,8 +978,11 @@ sub distance($$$$;$$) {
if ( $lat1 eq $lat2 && $lng1 eq $lng2 ); if ( $lat1 eq $lat2 && $lng1 eq $lng2 );
my $aearth = 6378.137; # GRS80/WGS84 semi major axis of earth ellipsoid my $aearth = 6378.137; # GRS80/WGS84 semi major axis of earth ellipsoid
my $km = great_circle_distance( deg2rad($lat1), pi/2. - deg2rad($lng1), my $km = great_circle_distance(
deg2rad($lat2), pi/2. - deg2rad($lng2), $aearth ); deg2rad($lat1), pi / 2. - deg2rad($lng1),
deg2rad($lat2), pi / 2. - deg2rad($lng2),
$aearth
);
return _round( return _round(
( (
@ -1131,24 +1119,38 @@ sub humanReadable($;$) {
); );
my $min = my $min =
ref($h) ref($h)
&& defined( $h->{min} ) && defined( $h->{min} ) ? $h->{min}
? $h->{min} : (
: ( !ref($f) && $hr_formats{$f}{min} ? $hr_formats{$f}{min} : 5 ); !ref($f)
&& $hr_formats{$f}{min} ? $hr_formats{$f}{min}
: 5
);
my $group = my $group =
ref($h) ref($h)
&& defined( $h->{group} ) && defined( $h->{group} ) ? $h->{group}
? $h->{group} : (
: ( !ref($f) && $hr_formats{$f}{group} ? $hr_formats{$f}{group} : 3 ); !ref($f)
&& $hr_formats{$f}{group} ? $hr_formats{$f}{group}
: 3
);
my $delim = my $delim =
ref($h) ref($h)
&& $h->{delim} && $h->{delim} ? $h->{delim}
? $h->{delim} : $hr_formats{
: $hr_formats{ ( $l =~ /^de|nl|fr|pl/i ? "std-fr" : "std" ) }{delim}; (
$l =~ /^de|nl|fr|pl/i ? "std-fr"
: "std"
)
}{delim};
my $sep = my $sep =
ref($h) ref($h)
&& $h->{sep} && $h->{sep} ? $h->{sep}
? $h->{sep} : $hr_formats{
: $hr_formats{ ( $l =~ /^de|nl|fr|pl/i ? "std-fr" : "std" ) }{sep}; (
$l =~ /^de|nl|fr|pl/i ? "std-fr"
: "std"
)
}{sep};
my $reverse = ref($h) && defined( $h->{rev} ) ? $h->{rev} : 1; my $reverse = ref($h) && defined( $h->{rev} ) ? $h->{rev} : 1;
my @p = split( /\./, $v, 2 ); my @p = split( /\./, $v, 2 );
@ -1477,9 +1479,15 @@ sub DaysOfMonth (;$$) {
my $m = shift; my $m = shift;
return undef return undef
unless ( !$y unless (
!$y
|| $y =~ /^\d{10}(?:\.\d+)?$/ || $y =~ /^\d{10}(?:\.\d+)?$/
|| ( $y =~ /^[1-2]\d{3}$/ && ( !$m || $m =~ /^\d{1,2}$/ ) ) ); || (
$y =~ /^[1-2]\d{3}$/
&& ( !$m
|| $m =~ /^\d{1,2}$/ )
)
);
my $t = ( $y =~ /^\d{10}(?:\.\d+)?$/ ? $y : gettimeofday() ); my $t = ( $y =~ /^\d{10}(?:\.\d+)?$/ ? $y : gettimeofday() );
$y = 1900. + ( localtime($t) )[5] unless ($y); $y = 1900. + ( localtime($t) )[5] unless ($y);
@ -1602,8 +1610,7 @@ sub GetDaytime(;$$$$) {
$ret->{daytimeRel} = s2hms( $ret->{daytimeRel_s} ); $ret->{daytimeRel} = s2hms( $ret->{daytimeRel_s} );
$ret->{daytimeT_s} = $ret->{sunset_s} - $ret->{sunrise_s}; $ret->{daytimeT_s} = $ret->{sunset_s} - $ret->{sunrise_s};
$ret->{daytimeT} = s2hms( $ret->{daytimeT_s} ); $ret->{daytimeT} = s2hms( $ret->{daytimeT_s} );
$ret->{daytimeStageLn_s} = $ret->{daytimeStageLn_s} = $ret->{daytimeT_s} / $ret->{daytimeStages};
$ret->{daytimeT_s} / $ret->{daytimeStages};
$ret->{daytimeStageLn} = s2hms( $ret->{daytimeStageLn_s} ); $ret->{daytimeStageLn} = s2hms( $ret->{daytimeStageLn_s} );
$ret->{daytimeStage_float} = $ret->{daytimeStage_float} =
$ret->{daytimeRel_s} / $ret->{daytimeStageLn_s}; $ret->{daytimeRel_s} / $ret->{daytimeStageLn_s};
@ -1695,7 +1702,8 @@ sub GetDaytime(;$$$$) {
$ret->{events}{ $ret->{midnight_t} }{DESC} = $ret->{events}{ $ret->{midnight_t} }{DESC} =
"Begin of night time and new calendar day"; "Begin of night time and new calendar day";
$ret->{events}{ $ret->{1}{midnight_t} }{TYPE} = "dayshift"; $ret->{events}{ $ret->{1}{midnight_t} }{TYPE} = "dayshift";
$ret->{events}{ $ret->{1}{midnight_t} }{TIME} = $ret->{date} . " 24:00:00"; $ret->{events}{ $ret->{1}{midnight_t} }{TIME} =
$ret->{date} . " 24:00:00";
$ret->{events}{ $ret->{1}{midnight_t} }{DESC} = $ret->{events}{ $ret->{1}{midnight_t} }{DESC} =
"End of calendar day and begin night time"; "End of calendar day and begin night time";
@ -1742,8 +1750,7 @@ sub GetDaytime(;$$$$) {
if ( $i == $ret->{daytimeStages} + 1 ) { if ( $i == $ret->{daytimeStages} + 1 ) {
$ret->{events}{$t}{TYPE} = "daytime"; $ret->{events}{$t}{TYPE} = "daytime";
$ret->{events}{$t}{VALUE} = "midevening"; $ret->{events}{$t}{VALUE} = "midevening";
$ret->{events}{$t}{DESC} = $ret->{events}{$t}{DESC} = "End of daytime";
"End of daytime";
} }
else { else {
$ret->{events}{$t}{TYPE} = "daytimeStage"; $ret->{events}{$t}{TYPE} = "daytimeStage";
@ -1846,13 +1853,15 @@ sub GetSeason (;$$$) {
else { else {
$ret->{'-1'}{$l}{seasonMeteo_long} = $ret->{'-1'}{$l}{seasonMeteo_long} =
$seasons{$l}[ $ret->{'-1'}{seasonMeteo} ]; $seasons{$l}[ $ret->{'-1'}{seasonMeteo} ];
$ret->{$l}{seasonMeteo_long} = $seasons{$l}[ $ret->{seasonMeteo} ]; $ret->{$l}{seasonMeteo_long} =
$seasons{$l}[ $ret->{seasonMeteo} ];
$ret->{1}{$l}{seasonMeteo_long} = $ret->{1}{$l}{seasonMeteo_long} =
$seasons{$l}[ $ret->{1}{seasonMeteo} ]; $seasons{$l}[ $ret->{1}{seasonMeteo} ];
$ret->{'-1'}{$l}{seasonAstro_long} = $ret->{'-1'}{$l}{seasonAstro_long} =
$seasons{$l}[ $ret->{'-1'}{seasonAstro} ]; $seasons{$l}[ $ret->{'-1'}{seasonAstro} ];
$ret->{$l}{seasonAstro_long} = $seasons{$l}[ $ret->{seasonAstro} ]; $ret->{$l}{seasonAstro_long} =
$seasons{$l}[ $ret->{seasonAstro} ];
$ret->{1}{$l}{seasonAstro_long} = $ret->{1}{$l}{seasonAstro_long} =
$seasons{$l}[ $ret->{1}{seasonAstro} ]; $seasons{$l}[ $ret->{1}{seasonAstro} ];
} }
@ -2045,7 +2054,8 @@ sub _GetSeasonPheno ($$;$$) {
if ( $l eq 'en' ) { if ( $l eq 'en' ) {
$ret->{'-1'}{seasonPheno_long} = $ret->{'-1'}{seasonPheno_long} =
$seasonsPheno{$l}[ $ret->{'-1'}{seasonPheno} ]; $seasonsPheno{$l}[ $ret->{'-1'}{seasonPheno} ];
$ret->{seasonPheno_long} = $seasonsPheno{$l}[ $ret->{seasonPheno} ]; $ret->{seasonPheno_long} =
$seasonsPheno{$l}[ $ret->{seasonPheno} ];
$ret->{1}{seasonPheno_long} = $ret->{1}{seasonPheno_long} =
$seasonsPheno{$l}[ $ret->{1}{seasonPheno} ]; $seasonsPheno{$l}[ $ret->{1}{seasonPheno} ];
} }
@ -2107,13 +2117,17 @@ sub decimal_mark ($;$) {
$thousands_sep = chr(0x202F) $thousands_sep = chr(0x202F)
unless ( defined($thousands_sep) && $thousands_sep ne "" ); unless ( defined($thousands_sep) && $thousands_sep ne "" );
my @grouping = my @grouping =
$grouping && $grouping =~ /^\d+$/ ? unpack( "C*", $grouping ) : (3); $grouping && $grouping =~ /^\d+$/
? unpack( "C*", $grouping )
: (3);
$i =~ s/(\d{$grouping[0]})(?=\d)/$1$thousands_sep/g; $i =~ s/(\d{$grouping[0]})(?=\d)/$1$thousands_sep/g;
$f =~ s/(\d{$grouping[0]})(?=\d)/$1$thousands_sep/g $f =~ s/(\d{$grouping[0]})(?=\d)/$1$thousands_sep/g
if ( defined($f) && $f ne '' ); if ( defined($f) && $f ne '' );
return ( $s ? $s : '' ) . ( reverse $i ) return
( $s ? $s : '' )
. ( reverse $i )
. ( defined($f) && $f ne '' ? $decimal_point . $f : '' ); . ( defined($f) && $f ne '' ? $decimal_point . $f : '' );
} }