vorschlag: newline in attribut werten zulassen

Begonnen von justme1968, 17 Oktober 2015, 20:23:27

Vorheriges Thema - Nächstes Thema

justme1968

zufälligerweise gab es heute zwei unabhängige fälle bei denen es nützlich wäre wenn fhemweb attribute mit newline handhaben könnte:

- mehrzeilige comment attribute: http://forum.fhem.de/index.php/topic,42405.msg345697.html#msg345697
- das mibs attribut von sysstat: http://forum.fhem.de/index.php/topic,10573.msg345514.html#msg345514

für readingsGroup wäre es glaube ich auch praktisch.

eine mögliche lösung könnte so aussehen:
- in fhemweb.js wird im empfangene attribut wert nicht mehr alle newline entfernt sondern nur das letzte. alle anderen werden durch einen platzhalter
- wenn das attribut in einem textField-long editiert wird werden die platzhalter wieder zu echten newline um das mehrzeilige editieren zu ermöglichen
- im ergebniss von textField-long werden die echten newline wieder durch die platzhalter
- fhemweb ersetzt die im post empfangenen platzhalter durch echte newline

im prinzip könnte man als platzhalter \\n oder <br> verwenden oder wie im DEF vorgehen. das funktioniert aber nicht weil textarea nur einzeilig ist und weil <br> und anderer html text auch 1:1 schon im attribut vorkommen können. ich habe deshalb unicode \u2424 als platzhalter genommen. das sollte im browser sogar als sinnvolles zeichen dargestellt (␤)werden und lässt sich zur not sogar im textarea eingeben.

die nötigen änderungen sind:--- fhemweb.js (revision 9035)
+++ fhemweb.js (working copy)
@@ -619,7 +619,8 @@
   qConn.onreadystatechange = function() {
     if(qConn.readyState != 4)
       return;
-    var qResp = qConn.responseText.replace(/[\r\n]/g, "");
+    var qResp = qConn.responseText.replace(/\n$/, '');
+    qResp = qResp.replace(/\n/g, '\u2424');
     if(el.setValueFn)
       el.setValueFn(qResp);
     qConn.abort();
@@ -669,7 +670,9 @@
         '<textarea id="td_longText" rows="25" cols="60" style="width:99%"/>'+
       '</div>');

-    $("#td_longText").val($(inp).val());
+    var txt = $(inp).val();
+    txt = txt.replace(/\u2424/g, '\n');
+    $("#td_longText").val(txt);

     var cm;
     if( typeof AddCodeMirror == 'function' )
@@ -688,6 +691,7 @@
           if(cm)
             $("#td_longText").val(cm.getValue());
           var res=$("#td_longText").val();
+          res = res.replace(/\n/g, '\u2424' );
           $(this).dialog('close');
           $(inp).val(res);
           addBlur();


01_FHEMWEB.pm:--- 01_FHEMWEB.pm (revision 9418)
+++ 01_FHEMWEB.pm (working copy)
@@ -901,6 +901,11 @@
   $cmd.=" $arg{$c}" if(defined($arg{$c}) &&
                        ($arg{$c} ne "state" || $cmd !~ m/^set/));
   $cmd.=" $val{$c}" if(defined($val{$c}));
+
+  #replace unicode newline symbol \u2424 with real newline
+  my $nl = chr(226) . chr(144) . chr(164);
+  $cmd =~ s/$nl/\n/g;
+
   return ($cmd, $c);
}


getestet mit safari,chrome und firefox unter mac os x. ich habe gerade keine windows rechner in der nähe.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

und das Ganze dann noch im codemirror editierbar machen  8)

*duck-und-weg*
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rapster

Sehr schön, das habe ich mir schon länger gewünscht :)

Funktioniert zwar generell im IE,FF41,Edge@Windows
Allerdings habe ich soeben mal versucht den cellStyle einer readingsGroup mehrzeilig zu speichern. Hier zerschießt es mir anschließend die gesamte rg  :(

cellStyle {␤ "r:1"=>'style="font-weight:bold;font-size:16px"',␤    "r:2,c:0"=>'style="font-weight:bold"',␤ "r:5,c:0" =>'style="font-weight:bold"',␤    "r:8,c:0"=>'style="font-weight:bold"',␤    "r:11,c:0"=>'style="font-weight:bold"'␤}

Gruß
  Claudiu

justme1968

@betateilchen: die textField-long popups sind schon mit codemirror editierbar. geht also automatisch spätestens wenn du wigetOverride <attribut>:textField-long für die entsprechenden attribute setzt.

@rapster: kann es sein das du den FHEMWEB teil bzw. das reload dazu vergessen hast? die ␤ werden zwar von der js seite an fhemweb zurück geschickt aber dort durch echte \n ersetzt. d.h. die ␤ dürfen nie im attribut auftauchen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rapster

#4
Ne fhemheb Teil ist drin,
hab fhem sogar ein ganzen restart spendiert   ::)

EDIT,
habs vorhin auch aus dem Editor-Fenster herauskopiert, hier mal aus der configDB:
search result for: cellStyle in version: 0
--------------------------------------------------------------------------------
attr heatingInfo cellStyle { "r:1"=>'style="font-weight:bold;;font-size:16px"',"r:2,c:0"=>'style="font-weight:bold"',  "r:5,c:0" =>'style="font-weight:bold"',  "r:8,c:0"=>'style="font-weight:bold"',  "r:11,c:0"=>'style="font-weight:bold"'}

Da sind die NL's zumindest nicht zu sehen.

EDIT2: nochmal ein Bild angehangen ;)

justme1968

#5
im kleinen textfield sind die ␤ zu sehen. das ist ok. im grossen popup werden sie durch echte new line ersetzt. im text neben dem attribut namen sind sie nicht zu sehen. das ist auch ok. schau mal bitte in dein config file ob sie da auftauchen. dort sollten ganz normale zeilenenden auftauchen die mit \ maskiert sind.

gruss
  andre

ps: ich glaube ich weiss was dein problem ist...
      readingsGroup muss angepasst werden damit an ein paar stellen die regex für ^{.*}$ die mehrzeiligen strings auch versteht.
      das kommite ich dann wenn rudi den patch akzeptiert. anbei eine test version.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rapster

Schaut auf den ersten Blick erstmal gut aus mit der angehängten readingsGroup.pm  8)

Auf dieses Problem könnten allerdings falls der Patch so akzeptiert wird wahrscheinlich mehrere Module stoßen wenn der User der Meinung ist das Attribut jeweils in mehreren Zeilen unterzubringen? Hmm...

Gruß
  Claudiu

rapster

Nachtrag auf deine Frage, in der configDB sind's echte newlines (siehe Bild), ebenfalls bei einem configDB search:
Die Zeilen werden allerdings nicht mit \ abgeschlossen.

search result for: cellstyle in version: 0
--------------------------------------------------------------------------------
attr heatingInfo cellStyle {
"r:1"=>'style="font-weight:bold;;font-size:16px"',
"r:2,c:0"=>'style="font-weight:bold"',
"r:5,c:0" =>'style="font-weight:bold"',
"r:8,c:0"=>'style="font-weight:bold"',
"r:11,c:0"=>'style="font-weight:bold"'
}

justme1968

#8
ich glaube das ist eher unkritisch. die meisten attribute sind eher kurz und selbst bei längeren wird selten per regex auf ^ und $ geprüft sondern meist mit split gearbeitet. comment ist völlig unkritisch. mibs auch. readngsGroup ist angepasst. meine anderen module prüfe ich uns ziehe sie nach. auf die schnelle fällt mir nur noch devStateIcon ein.  außerdem bekommt man die newline ja nicht automatisch sondern muss sie erst mit einem textField-long freischalten.

das schaut gut aus. genau so soll es sein. die \ siehst du nur im config file. bei allen anderen ausgaben sind sie transparent und treten nur als zeilenumbruch in erscheinung.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rapster

Auf die \ kommts (mir) zwar nicht an, allerdings bei einem mehrzeiligen notify seh ich sie in der config:

search result for: ntfy_Tuerklingel in version: 0
--------------------------------------------------------------------------------
define ntfy_Tuerklingel notify ^og_flur_sci_klingel:\s*closed.* {\
my $minDelay = 10;;\
    \
if ( time - ReadingsVal($SELF,'lastExecution',0) > $minDelay ) {\
fhem("set Sonos_Kueche,Sonos_Keller,Sonos_Bad,Sonos_Schlafzimmer Speak 48 de |doorbell| ");;\
CommandSetReading(undef, "$SELF lastExecution ". time);;\
}\
}\


Bei mehrzeiligen Attributen wie im letzten Post zu sehen nicht ;)

Gruß
  Claudiu

justme1968

dann muss betateilchen was dazu sagen. ich habe keine idee warum sie bei einer normalen ausgabe erscheinen. ausser sie werden absichtlich hinzugefügt. dann müsste das für die attribute auch gemacht werden. im config file sind sie jedenfalls da.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Habs eingecheckt. Weiterhin habe im telnet Modul die mehrzeilige Eingabe gefixt (\ entfernt), und das comment-Attribut auf textField-long gesetzt.

betateilchen

Zitat von: justme1968 am 18 Oktober 2015, 00:23:29
dann muss betateilchen was dazu sagen.

ganz einfach: weil es bisher keine mehrzeiligen Attribute gab und deshalb auch keine Behandlung von newlines nötig war.

@rapster: ist das nur ein Anzeigeproblem oder gibt es irgendwelche Fehler in der Nutzung der neuen mehrzeiligen Attribute?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

anders formuliert: die db sollte newline doch eigentlich transparent handhaben da sie nicht zeilenweise arbeitet. wo kommen die \ an den zeilenenden  der DEF anzeige oben her? sie erfüllen da ja keinen zweck.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rapster

Zitat von: betateilchen am 18 Oktober 2015, 16:51:49
@rapster: ist das nur ein Anzeigeproblem oder gibt es irgendwelche Fehler in der Nutzung der neuen mehrzeiligen Attribute?

Das betrifft lediglich die Anzeige, habe mittlerweile mehrere Sachen ohne Probleme auf multi line umgestellt.

Gruß
  Claudiu