From 6b2f119ab6123a3a3f4824b0e71825a18f31b02e Mon Sep 17 00:00:00 2001
From: phenning <>
Date: Fri, 27 Apr 2018 13:28:29 +0000
Subject: [PATCH] 95_Babble.pm: Verbessertes Handling von Umlauten
git-svn-id: https://svn.fhem.de/fhem/trunk@16665 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/FHEM/95_Babble.pm | 77 +++++++++++++++++++++++++++++++++---------
1 file changed, 61 insertions(+), 16 deletions(-)
diff --git a/fhem/FHEM/95_Babble.pm b/fhem/FHEM/95_Babble.pm
index 877c0b84c..96244262d 100644
--- a/fhem/FHEM/95_Babble.pm
+++ b/fhem/FHEM/95_Babble.pm
@@ -36,6 +36,8 @@ use vars qw(%intAt); # FHEM at definitions
use vars qw($FW_ME);
use JSON; # imports encode_json, decode_json, to_json and from_json.
+use Encode;
+
my $rive = 0;
my $riveinterpreter;
#-- RiveScript missing in System
@@ -53,7 +55,8 @@ if (eval {require RiveScript;1;} ne 1) {
my $babblelinkname = "babbles"; # link text
my $babblehiddenroom = "babbleRoom"; # hidden room
my $babblepublicroom = "babble"; # public room
-my $babbleversion = "1.33";
+my $babbleversion = "1.35";
+my @babblerows;
my %babble_transtable_EN = (
"ok" => "OK",
@@ -444,10 +447,9 @@ sub Babble_save($) {
$hash->{DATA}{"savedate"} = $date;
readingsSingleUpdate( $hash, "savedate", $date, 1 );
my $jhash0 = toJSON($hash->{DATA});
+ #$jhash0 = decode_utf8( $jhash0 );
if( ReadingsVal($name,"lockstate","locked") ne "locked" ){
my $error = FileWrite("babbleFILE",$jhash0);
- #Log3 $name, 1, " ".Dumper($jhash0);
-
Log3 $name,1,"[Babble_save]";
}else{
Log3 $name, 1, "[Babble] attempt to save data failed due to lockstate";
@@ -479,7 +481,9 @@ sub Babble_restore($$) {
return undef;
}
my $json = JSON->new->utf8;
- my $jhash1 = eval{ $json->decode( join('',@lines) ) };
+ my $jhash0 = join('',@lines);
+ $jhash0 = encode_utf8( $jhash0 );
+ my $jhash1 = eval{ $json->decode( $jhash0 ) };
my $date = $jhash1->{"savedate"};
#-- just for the first time, reading an old savefile
$date = localtime(time)
@@ -837,7 +841,7 @@ sub Babble_Normalize($$){
# status
}else{
$cat = 3;
- my $rex = $hash->{DATA}{"re_verbparts"}." ?".$hash->{DATA}{"re_verbsi"};
+ my $rex = $hash->{DATA}{"re_verbparts"}." ?".$hash->{DATA}{"re_verbsi"};
#-- guten morgen / gute nacht
if( $word[0] =~ /^gut.*/){
$subcat = 1;
@@ -1143,9 +1147,10 @@ sub Babble_DoIt{
if(index($stardev,'*')!=-1){
my $starrexp = $stardev;
$starrexp =~ s/\*/\(\.\*\)/;
- if( $realdev =~ /$starrexp/ ){
+ if( $realdev =~ m/$starrexp/ ){
$star = $1;
$cmd = $hash->{DATA}{"command"}{$stardev}{$place}{$verb}{$reading};
+ $cmd =~ s/\$STAR/$star/g;
if( defined($cmd) && $cmd ne "" ){
$device = $stardev;
last;
@@ -1446,9 +1451,9 @@ sub Babble_ModCmd($$$$$$){
#
#########################################################################################
-sub Babble_RemCmd($$$$$){
+sub Babble_RemCmd($$$$$$){
- my ($name,$bdev,$place,$verb,$target) = @_;
+ my ($name,$bdev,$place,$verb,$target,$fallback) = @_;
my $hash = $defs{$name};
#-- lower case characters
@@ -1463,9 +1468,19 @@ sub Babble_RemCmd($$$$$){
if( $verb eq "");
$target="none"
if( $target eq "");
-
- Log3 $name, 1,"[Babble_RemCmd] Deleting from hash: $bdev.$place.$verb.$target => ".$hash->{DATA}{"command"}{$bdev}{$place}{$verb}{$target};
- delete($hash->{DATA}{"command"}{$bdev}{$place}{$verb}{$target});
+ #-- trying to delete from data obtained via web
+ if( defined($hash->{DATA}{"command"}{$bdev}{$place}{$verb}{$target}) ){
+ Log3 $name, 1,"[Babble_RemCmd] Deleting from hash: $bdev.$place.$verb.$target => ".$hash->{DATA}{"command"}{$bdev}{$place}{$verb}{$target};
+ delete($hash->{DATA}{"command"}{$bdev}{$place}{$verb}{$target});
+ return
+ #-- try to figure out data from index (fallback strategy)
+ }else{
+ my $cmdstr = $babblerows[$fallback-1];
+ ($bdev,$place,$verb,$target)=split('\+\|\+',$cmdstr);
+ Log3 $name, 1,"[Babble_RemCmd] Deleting in fallback strategy from hash: $bdev.$place.$verb.$target => ".$hash->{DATA}{"command"}{$bdev}{$place}{$verb}{$target};
+ delete($hash->{DATA}{"command"}{$bdev}{$place}{$verb}{$target});
+ return
+ }
}
#########################################################################################
@@ -1710,10 +1725,16 @@ sub Babble_getplaces($$$) {
if( !defined($sel) ){
return "";
}else{
+ $sel = lc($sel);
+ #-- todo: geht das einfacher ?
+ $sel =~ s/\xe3\xbc/ü/g;
+ $sel =~ s/\xe3\xb6/ö/g;
+ $sel =~ s/\xe3\xa4/ä/g;
+ $sel =~ s/\xe3\x9f/ß/g;
my $ret = ($sel eq "none") ? '';
for( my $i=0;$i' : '';
}
return $ret;
@@ -1760,7 +1781,13 @@ sub Babble_getverbs($$$) {
}
}
$hash->{DATA}{"re_verbsi"} = "(?P(".lc( join(")|(",@{$hash->{DATA}{"verbsi"}}))."))";
- $hash->{DATA}{"re_verbsc"} = lc("((".join(")|(",(keys %{$hash->{DATA}{"verbs"}}))."))");
+ #$hash->{DATA}{"re_verbsc"} = lc("((".join(")|(",(keys %{$hash->{DATA}{"verbs"}}))."))");
+ my $verbsc="((";
+ while (my ($key, $value) = each %{$hash->{DATA}{"verbs"}}){
+ $verbsc.=lc($key).")|(";
+ }
+ $verbsc =~ s/\)\|\($/))/;
+ $hash->{DATA}{"re_verbsc"}=$verbsc;
return;
#-- just do something with the current list
}elsif( $type eq "html" ){
@@ -1770,10 +1797,18 @@ sub Babble_getverbs($$$) {
if( !defined($sel) ){
return "";
}else{
+ $sel = lc($sel);
+ #-- todo: geht das einfacher ?
+ $sel =~ s/\xe3\xbc/ü/g;
+ $sel =~ s/\xe3\xb6/ö/g;
+ $sel =~ s/\xe3\xa4/ä/g;
+ $sel =~ s/\xe3\x9f/ß/g;
+ #my $sel1 = encode_utf8($sel);
+ #my $sel2 = decode_utf8($sel);
my $ret = ($sel eq "none") ? '';
for( my $i=0;$i";
}else{
+ $sel = lc($sel);
+ #-- todo: geht das einfacher ?
+ $sel =~ s/\xe3\xbc/ü/g;
+ $sel =~ s/\xe3\xb6/ö/g;
+ $sel =~ s/\xe3\xa4/ä/g;
+ $sel =~ s/\xe3\x9f/ß/g;
my $ret = ($sel eq "none") ? '';
for( my $i=0;$i
".$babble_tt->{"babbledev"}."
";
@@ -1993,6 +2036,7 @@ sub Babble_Html($)
"
".$babble_tt->{"place"}."
".$babble_tt->{"verb"}."
".$babble_tt->{"target"}."
\n".
"
".$babble_tt->{"action"}."
".$babble_tt->{"confirm"}."
{"save"}.
"\" style=\"width:100px;\"/>
\n";
+
#-- loop over all unique devices to get some sorting
if( defined($hash->{DATA}{"devsalias"}) ){
for my $alidev (sort keys %{$hash->{DATA}{"devsalias"}}) {
@@ -2062,6 +2106,8 @@ sub Babble_Html($)
}else{
$checked="";
}
+ push(@babblerows,$lbdev."+|+".$place."+|+".$verb."+|+".$target);
+ $indrow++;
$tblrow++;
$devrow++;
@@ -2076,7 +2122,7 @@ sub Babble_Html($)
"
\n";
$rot .= "
";
$rot .= "
";
- $rot .= "
{"remove"}."\" style=\"width:100px;\"/>
\n";#$tblrow-$devcount.$devrow
+ $rot .= "
{"remove"}."\" style=\"width:100px;\"/>
\n";#$tblrow-$devcount.$devrow
}
}
}
@@ -2244,7 +2290,6 @@ sub Babble_Html($)
locked means that babble setups may not be changed, unlocked
means that babble setups may be changed>
-
=end html
=begin html_DE