Seltsames Resultat im notify

Begonnen von Sailor, 16 Januar 2022, 20:45:59

Vorheriges Thema - Nächstes Thema

Sailor

Ein herzerfrischendes "Moin" vom achtern Diek vorweg!

Ich habe eine kleine Entdeckung beim Programmieren eines notifys gemacht, wo ich mal Eure Einschaetzung brauche ob das ein Bug oder Feature ist.

Ich moechte mit einem notify in einem String (und letztendliches im Reading)  folgenden Eintrag haben:

<table style="table-layout:fixed; border=1px; cellpadding=3; width=100%;" >

Dies habe ich mit folgenden Codes versucht zu realisieren:


my $htmlString = "<table style=\"table-layout:fixed; border=1px; cellpadding=3; width=100%;\" >";
my $htmlString = "<table style=\"table-layout:fixed\; border=1px\; cellpadding=3\; width=100%\;\" >";
my $htmlString = "<table style=\"table-layout:fixed" . chr(59) . "border=1px" . chr(59) . " cellpadding=3" . chr(59) . " width=100%" . chr(59) . "\" >";
my $htmlString = '<table style=\"table-layout:fixed; border=1px; cellpadding=3; width=100%; \">';


Alle Varianten spucken mir lediglich
<table style="table-layout:fixed
aus, weil das erste Semikolon als Perl - Delimiter interpretiert wird.

Wie bekomme ich den Perl-Interpreter dazu, das Semikolon im String zu ignorieren?

Wer an dem ganzen Code interessiert ist - Er liest 4 fhem-Calender--Device ein und stellt die naechsten 30 Tage tabelarisch dar.
Die Variante unten funktioniert, da ich das obige Problem dort noch nicht eingearbeitet habe.


UI_Calendar_..:lastUpdate.* {

Log 5, "UI_CalendarUpdate - ____________________________________________________";

my @CalendarDeviceList = ("UI_Calendar_MD","UI_Calendar_DD", "UI_Calendar_LD", "UI_Calendar_BD");

my $htmlString = "
<table border=\"1px\" cellpadding=\"3\" width=\"100%\" style=\"table-layout:fixed\">";


my @Month   = ("", "January", "February", "March", "April", "May", "June", "July", "August", "September", "Oktober", "November", "December");
my @WeekDay = ("Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");

$htmlString .= "
<tr><td align=center style=\"font-size:20px\" width=\"7%\"><b>Date</b></td><td align=center style=\"font-size:20px\" width=\"20%\"><b>Papa</b></td><td align=center style=\"font-size:20px\" width=\"20%\"><b>Mama</b></td><td align=center style=\"font-size:20px\" width=\"20%\"><b>Sohn</b></td><td align=center style=\"font-size:20px\" width=\"20%\"><b>Tochter</b></td></tr>";

#For each table row
for (my $i = 0; $i < 32; $i++) {

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time+(24*60*60*$i));


if ($wday == 0) {
$htmlString .= "
<tr><td align=right style=\"background-color:#ff0000\" style=\"word-break:break-all\">"
}

else {
$htmlString .= "
<tr><td align=right                                    style=\"word-break: break-all\">"
}


$htmlString .= $WeekDay[$wday] . ",<BR>" . sprintf("%02d", $mday) . "." . sprintf("%02d", ($mon+1)) . "." . sprintf("%04d", ($year+1900)) . "</td>";

# For each Calendar perform
foreach my $CurrentCalendar ( @CalendarDeviceList ) {

my $CalItem = fhem("get ". $CurrentCalendar . " events timeFormat:\"%H:%M\" format:text limit:when=" . $i . " format:custom=\"\$T1 \$D \$S\"" ,1);
my $CalItemString;

if (defined($CalItem)) {
my @CalItemsList = split("\n", $CalItem);

foreach my $CalItemsListEntry ( @CalItemsList ) {

my @CalItemsListEntrySplitoff = split(" ", $CalItemsListEntry);

if (($CalItemsListEntrySplitoff[0] eq "00:00") && (($CalItemsListEntrySplitoff[1] eq ("24h")) || ($CalItemsListEntrySplitoff[1] eq ("48h"))|| ($CalItemsListEntrySplitoff[1] eq ("72h")))) {

splice(@CalItemsListEntrySplitoff, 0, 2);
$CalItemString .= "AllDay: ";
$CalItemString .= join(" ", @CalItemsListEntrySplitoff) . "<BR>";
}
else {
splice(@CalItemsListEntrySplitoff, 1, 1);
$CalItemString .= join(" ", @CalItemsListEntrySplitoff) . "<BR>";
}
}
}
else {
$CalItemString = " ";
}

if ($wday == 0) {
$htmlString .= "<td align=left style=\"background-color:#ff0000\" style=\"word-break: break-all\">"
}
else {
$htmlString .= "<td align=left style=\"word-break: break-all\">"
}

$htmlString .= $CalItemString;
$htmlString .= "</td>";

}

$htmlString .= "</tr>";
}

$htmlString .= "</table>";

fhem("set UI_Calendar_All " . $htmlString);

return();
}


Gruß
    Sailor

******************************
Man wird immer besser...

DS_Starter

Hmm..... Weiterer Versuch mit:


my $htmlString = qq{<table style="table-layout:fixed; border=1px; cellpadding=3; width=100%;">};


Ansonsten würde ich alles in eine sub in 99_myUtlis packen und nur die sub aufrufen. Würde sich vermutlich
ohnehin anbieten.

LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

TomLee

#2
"Innen" muss man die Semikola verdoppeln und wenn  man innen doppelte Quotes verwendet müssen die aussen einfache Quotes sein, ausser du hast innen eine Varable die aufgelöst werden muss, dann könnte man qq() verwenden.

Beide Varianten sollten mMn. klappen:

{ my $htmlString = q(<table style="table-layout:fixed;; border=1px;; cellpadding=3;; width=100%;;" >);; return $htmlString;;}

{ my $htmlString = '<table style="table-layout:fixed;; border=1px;; cellpadding=3;; width=100%;;" >';; return $htmlString;;}


Gruß

Thomas

edit:

Man muss die Semikola nur in der Kommandozeile verdoppeln, in der myUtils reichen einfache.


rudolfkoenig

Meiner Meinung nach sollte alles was laenger als eine Zeile ist, oder mehrere Semikola beinhaltet, als Funktion in 99_myUtils.pm definiert werden. Syntax-Fehler sind in so verstaendlicher, und man muss nicht ueber Newline oder verdoppelte Semikola nachdenken. Selbst das Testen ist (etwas) einfacher.

Sailor

Moin zusammen

Danke für Eure Hilfe.

Habe den Code zwar in die 99_myUtils.pm ausgelagert, aber selbst dort muss man
my $htmlString = "<table style=\"width:100%;; table-layout:fixed;;\">";

verwenden um folgendes zu erhalten:
<table style="width:100%; table-layout:fixed;">

Gruß
    Sailor
******************************
Man wird immer besser...

betateilchen

Hallo Herr Nachbar,

kann es sein, dass Du Dir das Leben mal wieder unnötig schwer machst?


sub test {
my $htmlString = '<table style="width:100%; table-layout:fixed;">';
Debug $htmlString;
}


Das liefert mir im Logfile

DEBUG><table style="width:100%; table-layout:fixed;">
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Sailor

Auch Hallo Herr Nachbar  ;)

Zitat von: betateilchen am 18 Januar 2022, 12:33:26
Hallo Herr Nachbar,
kann es sein, dass Du Dir das Leben mal wieder unnötig schwer machst?

sub test {
my $htmlString = '<table style="width:100%; table-layout:fixed;">';
Debug $htmlString;
}


Das liefert mir im Logfile
DEBUG><table style="width:100%; table-layout:fixed;">

Warum einfach, wenn es klombisiert geht?  ;D

Wie oben schon beschrieben hat in meinem Versuch oben 'Bla;Bla' auch nur zu Bla gefuehrt.

Aber es funktioniert ja jetzt.

Anbei der Code für neugierige


###START########## Create TimeTable html Code ####################################################################START###
sub CodeTimetable() {

Log 5, "UI_CalendarUpdate - ____________________________________________________";

my @CalendarDeviceList = ("UI_Calendar_MD","UI_Calendar_DD", "UI_Calendar_LD", "UI_Calendar_BD");

my $htmlString = "
<table style=\"width:100%;; table-layout:fixed;;\">
";


my @Month   = ("", "January", "February", "March", "April", "May", "June", "July", "August", "September", "Oktober", "November", "December");
my @WeekDay = ("Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");

$htmlString .= "
<tr>
<td align=center style=\"border:1px solid;; padding:3px;; font-size:20px;; width=12%;; word-break:break-word;;\"><b>Date</b></td>
<td align=center style=\"border:1px solid;; padding:3px;; font-size:20px;; width=22%;; word-break:break-word;;\"><b>Papa</b></td>
<td align=center style=\"border:1px solid;; padding:3px;; font-size:20px;; width=22%;; word-break:break-word;;\"><b>Mama</b></td>
<td align=center style=\"border:1px solid;; padding:3px;; font-size:20px;; width=22%;; word-break:break-word;;\"><b>Sohn</b></td>
<td align=center style=\"border:1px solid;; padding:3px;; font-size:20px;; width=22%;; word-break:break-word;;\"><b>Tochter</b></td>
</tr>";

#For each table row
for (my $i = 0; $i < 32; $i++) {

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time+(24*60*60*$i));


if ($wday == 0) {
$htmlString .= "
<tr><td style=\"background-color:#ff0000;; border:1px solid;; padding:3px;; align:right;; word-break:break-word;;\">"
}

else {
$htmlString .= "
<tr><td <td style=\"                       border:1px solid;; padding:3px;; align:right;; word-break:break-word;;\">"
}


$htmlString .= $WeekDay[$wday] . ",<BR>" . sprintf("%02d", $mday) . "." . sprintf("%02d", ($mon+1)) . "." . sprintf("%04d", ($year+1900)) . "</td>";

# For each Calendar perform
foreach my $CurrentCalendar ( @CalendarDeviceList ) {

my $CalItem = fhem("get ". $CurrentCalendar . " events timeFormat:\"%H:%M\" format:text limit:when=" . $i . " format:custom=\"\$T1 \$D \$S\"" ,1);
my $CalItemString;

if (defined($CalItem)) {
my @CalItemsList = split("\n", $CalItem);

foreach my $CalItemsListEntry ( @CalItemsList ) {

my @CalItemsListEntrySplitoff = split(" ", $CalItemsListEntry);

if (($CalItemsListEntrySplitoff[0] eq "00:00") && (($CalItemsListEntrySplitoff[1] eq ("24h")) || ($CalItemsListEntrySplitoff[1] eq ("48h"))|| ($CalItemsListEntrySplitoff[1] eq ("72h")))) {

splice(@CalItemsListEntrySplitoff, 0, 2);
$CalItemString .= "AllDay: ";
$CalItemString .= join(" ", @CalItemsListEntrySplitoff) . "<BR>";
}
else {
splice(@CalItemsListEntrySplitoff, 1, 1);
$CalItemString .= join(" ", @CalItemsListEntrySplitoff) . "<BR>";
}
}
}
else {
$CalItemString = " ";
}

if ($wday == 0) {
$htmlString .= "<td style=\"background-color:#ff0000;; border:1px solid;; padding:3px;; align:left;; word-break:break-word;;\">"
}
else {
$htmlString .= "<td style=\"                           border:1px solid;; padding:3px;; align:left;; word-break:break-word;;\">"
}

$htmlString .= $CalItemString;
$htmlString .= "</td>";

}

$htmlString .= "</tr>";
}

$htmlString .= "</table>";

fhem("set UI_Calendar_All " . $htmlString);

return();


}
####END########### Create TimeTable html Code #####################################################################END####



Liefert im dummy UI_Calendar_All einen html - String, der eine 30 Tage im voraus schauende Tabelle mit allen Calender Items anzeigt.

Gruß
    Sailor
******************************
Man wird immer besser...

betateilchen

Zitat von: Sailor am 18 Januar 2022, 14:41:31
Wie oben schon beschrieben hat in meinem Versuch oben 'Bla;Bla' auch nur zu Bla gefuehrt.

kann man glauben, muss man aber nicht  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Ich habs nicht nochmal ausprobiert aber ich bleib bei meiner Meinung das du überall wo du den HTML-Code anhängst und dazu aussen doppelte Anführungszeichen verwendest ganz simpel einfache Anführungszeichen verwenden kannst und dir "innen" das verdoppeln der Semikola und das escapen der doppelten Anführungszeichen sparst.

Du könntest auch in dem Rest vom Code, ausnahmslos mein ich (habs nur überflogen), überall dort wo du doppelte Quotes verwendet hast, einfache nehmen.