[Vorschlag] 98_help.pm zur Anzeige modulspezifischer Doku

Begonnen von betateilchen, 16 Februar 2015, 18:44:11

Vorheriges Thema - Nächstes Thema

betateilchen

Angeregt durch diese im Rahmen einer ganz anderen Diskussion aufgeworfene berechtigte Bemerkung:

Zitat von: AitschPi am 15 Februar 2015, 18:45:01
Die Befehlsreferenz in aktueller Form Mistbauch recht träge, denn da ist in den Jahren jetzt ziemlich viel hinzu gekommen.
...
Dann muss nicht immer alles komplett auf leistungsschwachen Telefonboxen oder Einplatinenrechnern laden, nur um für ein Modul etwas nachzusehen.

habe ich mich hingesetzt und ein CommandModul 98_commandref.pm zusammengeschraubt, mit dem man die Doku für ein einzelnes Modul aufrufen kann, die dann im Frontend angezeigt wird.

Damit der html-Inhalt im content-<div> des Frontends angezeigt wird, fiel mir kein anderer Weg ein, als diese zwei Zeilen in die 01_FHEMWEB.pm einzufügen:


Index: 01_FHEMWEB.pm
===================================================================
--- 01_FHEMWEB.pm (revision 8009)
+++ 01_FHEMWEB.pm (working copy)
@@ -761,6 +761,7 @@
     $FW_room = "";

     if( $FW_cmdret !~ m/<html>.*<\/html>/ ) {
+      if( $FW_cmdret !~ s/commandreftext// ) {
       $FW_cmdret = FW_htmlEscape($FW_cmdret);

       my @lines = split( /\n/, $FW_cmdret ); # Adding links
@@ -776,6 +777,7 @@

       $FW_cmdret =~ s/:\S+//g if($FW_cmdret =~ m/unknown.*choose one of/i);
       $FW_cmdret = "<pre>$FW_cmdret</pre>" if($FW_cmdret =~ m/\n/);
+      }
     }

     FW_pO "<div id=\"content\">


Ich stelle das hier einfach als ersten Entwurf zur Diskussion. Falls jemand bessere Vorschläge hat, immer her damit.


commandref frm_lcd

liefert beispielsweis als Ergebnis (ich hatte eine möglichst "kleine" Doku gesucht):

(http://up.picr.de/21018734ph.png)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

genau das wollte ich auch schon einbauen :)

um html anzuzeigen musst du nur ein <html> tag um die ausgabe rum machen. d.h. die zeile 47 so ändernreturn "<html>$output</html>";.

genau für die möglichkeit aus einem kommando direkt html zurück geben zu können hatte ich die m/<html>.*<\/html>/ prüfung ja eingebaut.

ich fände es schön wenn diese funktionalität in das normale help kommando eingebaut wird. das ist kürzer zu tippen und vermutlich sogar etwas das die meisten probieren.

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

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

betateilchen

#2
Das hatte ich probiert - aber das hat nicht funktioniert.





EDIT: Wieso funktioniert das jetzt? Ich hatte vorhin fast eine halbe Stunde daran rumgebastelt, das mit <html> zum Laufen zu bringen...

Ich schau mir mal an, das in help zu integrieren.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

das habe ich gerade hier probiert und es geht... sowohl mit safari als auch mit chrome.

und noch ein vorschlag. wenn man die rückgabe im telnet fall ein klein wenig aufbereitet ist es auch per telnet halbwegs benutzbar:if( $cl
    && $cl->{TYPE} eq 'telnet' ) {
   $output =~ s/<br>/\n/g;
   $output =~ s/<\/a>//g;
   $output =~ s/<a.*>//g;
   $output =~ s/<ul>/\n/g;
   $output =~ s/<li>/-/g;
   $output =~ s/<\/li>/\n/g;
   $output =~ s/<\/ul>/\n/g;

   return $output;
}

return "<html>$output</html>";
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

betateilchen

Zum Testen in der fhem.pl:


sub
CommandHelp($$)
{
  my ($cl, $param) = @_;

  if($param) {
     return getCommandref($cl,$param); 
  } else {

  my $str = "\n" .
            "Possible commands:\n\n" .
            "Command   Parameter                 Description\n" .
    "-----------------------------------------------\n";

  for my $cmd (sort keys %cmds) {
    next if(!$cmds{$cmd}{Hlp});
    next if($cl && $cmds{$cmd}{ClientFilter} &&
            $cl->{TYPE} !~ m/$cmds{$cmd}{ClientFilter}/);
    my @a = split(",", $cmds{$cmd}{Hlp}, 2);
    $str .= sprintf("%-9s %-25s %s\n", $cmd, $a[0], $a[1]);
  }

  return $str;
  }
}

sub getCommandref {
my ($cl,$mod) = @_;
    return "Usage: commandref <moduleName>" unless $mod;
    $mod = lc($mod);
    my @tags = ();
my %mods;
my @modDir = ("FHEM");
foreach my $modDir (@modDir) {
  opendir(DH, $modDir) || die "Cant open $modDir: $!\n";
  while(my $l = readdir DH) {
next if($l !~ m/^\d\d_.*\.pm$/);
my $of = $l;
$l =~ s/.pm$//;
$l =~ s/^[0-9][0-9]_//;
$mods{lc($l)} = "$modDir/$of";
  }
}
return "Module $mod not found" unless defined($mods{$mod});
my $output = "";
my $skip = 1;
my ($err,@text) = FileRead({FileName => $mods{$mod}, ForceType => 'file'});
    return $err if $err;
    foreach my $l (@text) {
  if($l =~ m/^=begin html$/) {
$skip = 0;
  } elsif($l =~ m/^=end html$/) {
$skip = 1;
  } elsif(!$skip) {
$output .= $l;
  }
}

   if( $cl  && $cl->{TYPE} eq 'telnet' ) {
     $output =~ s/<br>/\n/g;
     $output =~ s/<br\/>/\n/g;
     $output =~ s/<\/a>//g;
     $output =~ s/<a.*>//g;
     $output =~ s/<ul>/\n/g;
     $output =~ s/<\/ul>/\n/g;
     $output =~ s/<li>/-/g;
     $output =~ s/<\/li>/\n/g;
     $output =~ s/<code>//g;
     $output =~ s/<\/code>//g;
     $output =~ s/&lt;/</g;
     $output =~ s/&gt;/>/g;
     $output =~ s/<[bui]>/\ /g;
     $output =~ s/<\/[bui]>/\ /g;
     $output =~ s/\ \ +/\ /g;
     $output =~ s/\t+/ /g;
     $output =~ s/\n\n/\n/g;
     return $output;
  }
  return "<html>$output</html>";
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Markus Bloch

Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

betateilchen

Allerdings würde ich dafür plädieren, die CommandHelp dann komplett aus der fhem.pl auszulagern. Zum einen, um Rudi und die fhem.pl zu "entlasten" und zum anderen aus Gründen der Wartbarkeit der Hilfefunktion generell.

Einschränkungen sehe ich dabei nur eine: Die Eingabe von "?" zum Aufruf der Hilfe würde vermutlich nicht mehr funktionieren. Man könnte aber sicher einen Hinweis ausgeben, "help" zu benutzen oder ähnliches.

Eine Moduldatei für die CommandHelp habe ich hier bereits fertig.

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

rudolfkoenig

ZitatEine Moduldatei für die CommandHelp habe ich hier bereits fertig.
Wo denn?

ZitatDie Eingabe von "?" zum Aufruf der Hilfe würde vermutlich nicht mehr funktionieren.
Vermutlich kann man das mit ReplacedBy (analog zu updatefhem) auch loesen.

betateilchen

#8
Ich hab das Modul jetzt nochmal "schöngemacht" und auch eine Doku ergänzt.

(http://up.picr.de/21028931rs.png)

Das Modul kann ich bei Bedarf jederzeit einchecken, vorausgesetzt, SVN ist irgendwann wieder bereit, commits entgegenzunehmen. Es klemmt grade mal wieder.

In der fhem.pl gibt es (wenn ich mich recht erinnere) vier Stellen, an denen Bezug auf CommandHelp() genommen wird.

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

rudolfkoenig

- 98_help.pm aus contrib nach FHEM geschoben.
- help / CommandHelp aus fhem.pl entfernt
- ? verweist auf help per ReplacedBy
- Attribut language fuer global eingefuegt (jaja, Pandora und so).
- help Abschnitte aus commandref_frame*.html entfernt
- deutsche Uebersetzung in 98_help.pm hinzugefuegt.
- "Device Specific help" in der Detail-Ansicht wird beim Laden von fhemweb.js durch ein Aufruf von "help <modulname>" via XHR ersetzt. Vorteile: Spuerbar schneller und die Hilfe wird auf der gleichen Seite angezeigt. Nachteil: die HTML-Links funktionieren (noch?) nicht.

Bemerkungen:
- help im telnet ist noch ziemlich unverstaendlich, siehe "help at" oder "help notify".
- man koennte einige Abschnitte aus doc/commandref.html anzeigen, wie global, command, devspec, attributes und perl, auch weil man in FHEMWEB im global-Detailansicht "help global" aufgerufen wird. Falls deswegen commandref_frame.html angepasst werden muss, dann bitte Bescheid geben.

Es waer mir lieber, wenn du (betateilchen) das Modul uebernimmst.
Falls dir das nicht passt, dann werde ich der Maintainer.

betateilchen

Zitat von: rudolfkoenig am 18 Februar 2015, 18:41:59
Es waer mir lieber, wenn du (betateilchen) das Modul uebernimmst.
Falls dir das nicht passt, dann werde ich der Maintainer.

Doch, passt schon. Ich kümmere mich drum, auch um Deine Anmerkungen oben.

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

betateilchen

"help" kann jetzt auch deutsch. Nach dem Modulnamen ein "de" als Parameter angeben.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

ich glaube rudis idee war das language attribut zu verwenden um die default sprach zu bestimmen. dann müsste man de oder en nur noch angeben wenn man gerade nicht den default möchte.

für die deutsche version wäre es glaube ich noch gut die &uml tags zu ersetzten.

vielleicht könnte man optional auch das HTML::FormatText modul für die telnet version verwenden wenn es installiert ist.
das formatiert die listen ziemlich gut.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

betateilchen


  • wer setzt denn schon das language Attribut?
  • en muss man nicht angeben, das wird verwendet, wenn nicht explizit de angegeben wird
  • die Umlautersetzung kommt noch


  • Solange nicht jedes Modul mehrsprachige Doku liefert, macht eine automatische Sprachfindung für mich keinen Sinn.
  • Ebenso dürfte sich der Kreis der Anwender, die per telnet arbeiten und dabei dann doch noch die modulspezifische Hilfe brauchen, ziemlich in Grenzen halten.

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

justme1968

Zitatwer setzt denn schon das language Attribut?
vermutlich noch niemand. das hat rudi wie oben steht gerade erst eingebaut. in zukunft vermute ich aber einige. zumindest wenn es eine sinnvolle verwendung dafür gibt. das help modul wäre genau so eine...

wie kommst du auf automatisch?

aber da du es ansprichst: wenn es in der deutschen version den  'Leider keine deutsche Dokumentation vorhanden. Die englische Version gibt es hier...' link gibt könnte man automatisch auf die englische umschalten.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

justme1968

@rudi: mit der folgenden änderung in fhemweb.js werden die links in der html doku ersetzt:--- fhemweb.js (revision 8036)
+++ fhemweb.js (working copy)
@@ -149,14 +149,28 @@
         $("#devSpecHelp").remove();
         return;
       }
+
       $("#content").append('<div id="devSpecHelp"></div>');
-      FW_cmd(FW_root+"?cmd=help "+dev+"&XHR=1", function(data) {
-        $("#devSpecHelp").html(data);
-      });
+
+      function
+      setContent(dev) {
+        FW_cmd(FW_root+"?cmd=help "+dev+"&XHR=1", function(data) {
+          $("#devSpecHelp").html(data);
+          $(window).scrollTop($("#devSpecHelp").offset().top-200);
+
+          $("#devSpecHelp").find("a[href]").each(function(){
+            var dev = $(this).attr("href").split("#").pop();
+            $(this).attr("href", "#");
+            $(this).click(function(evt){
+              setContent(dev);
+            });
+          });
+        });
+      }
+
+      setContent(dev);
     });
   });
falls es links auf externe seiten gibt muss man die vermutlich anders behandeln.

schau dir mal an ob du das scrollTop magst. ohne hatte ich das problem das der seite nicht wirklich anzusehen ist das unten plötzlich doku steht.


ich glaube du hast die fhemweb änderungen vergessen damit das ersetzen auf js seite auch funktioniert:--- 01_FHEMWEB.pm (revision 8037)
+++ 01_FHEMWEB.pm (working copy)
@@ -1093,7 +1093,7 @@

   FW_pH "cmd=style iconFor $d", "Select icon";
   FW_pH "cmd=style showDSI $d", "Extend devStateIcon";
-  FW_pH "$FW_ME/docs/commandref.html#${t}", "Device specific help";
+  FW_pO "<div class='devSpecHelp'><a href=\"$FW_ME/docs/commandref.html#${t}\">Device specific help</a></div>";
   FW_pH "cmd=delete $d", "Delete this device ($d)" if($d ne "global");
   FW_pO "<br><br>";
   FW_pO "</div>";



wie wäre jeweils es oben in die doku einen passenden link auf die jeweils andere sprache zu generieren? das umschalten würde dann automatisch über die per ersetzten links gehen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

rudolfkoenig

Zitatmit der folgenden änderung in fhemweb.js werden die links in der html doku ersetzt:
Funktioniert nur fuer die Modul-Links (fuer die anderen kommt eine doofe Fehlermeldung), und das auch nur im devSpecHelp, nicht wenn man "help modul" direkt aufruft. Ich praeferiere eine Ersetzung aller relativen Links (d.h. href="#..." ) durch href="commandref.html#...", durchgefuehrt vom help Modul.

Zitatich glaube du hast die fhemweb änderungen vergessen damit das ersetzen auf js seite auch funktioniert:
Stimmt, habs jetzt eingecheckt.

Zitatwie wäre jeweils es oben in die doku einen passenden link auf die jeweils andere sprache zu generieren?
Gerne, aber dazu muesste fhemweb.js wissen, was die aktuelle Sprache ist.
FHEMWEB.pm koennte "global language" auf der Seite hinterlegen, allerdings muesste help dieses Attribut auch unterstuetzen.

justme1968

die anderen links gehen nicht weil help devspec und ähnliche nicht gehen. absolute links würden hier tatsächlich helfen.

hast du dir das mit dem scrollTop noch mal angeschaut? es ist sehr viel schöner wenn man nach dem ausklappen direkt die hilfe sieht und nicht noch mal nach unten scrollen muss.

apropos links: im darkstyle sind die ganzen links nicht zu erkennen. zumindest im neuen devSpecHelp div könnte man sie jetzt per css sichtbar machen.


wenn das help modul die sprach links einbaut müsste mal language noch nicht mal durch reichen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

betateilchen

Zitat von: rudolfkoenig am 19 Februar 2015, 09:23:28
allerdings muesste help dieses Attribut auch unterstuetzen.

daran soll es nicht scheitern.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#19
Zitat von: justme1968 am 18 Februar 2015, 22:55:23
vermutlich noch niemand. das hat rudi wie oben steht gerade erst eingebaut. in zukunft vermute ich aber einige. zumindest wenn es eine sinnvolle verwendung dafür gibt. das help modul wäre genau so eine...

Das Modul bestimmt nun die Sprache in folgender Reihenfolge:


  • Sprachparameter beim Aufruf übergeben
  • globales Attribut "language"
  • wenn nichts definiert ist: englisch


Wenn in einem Modul keine deutsche Hilfe gefunden wird, geht es mit einem entsprechenden Hinweis automatisch mit englisch weiter:

(http://up.picr.de/21048191pr.png)

Sind damit jetzt alle karierten Maiglöckchen gepflückt?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Markus Bloch

Hi betateilchen,

find dein Feature echt super, nur leider funktioniert es bei mir nicht.

Ich würde mich freuen, wenn du in folgender Zeile

Zeile 26:    my @modDir = ("FHEM");

auch AttrVal("global", "modpath","")."/FHEM" mit berücksichtigen könntest. Also:

Zeile 26:    my @modDir = ("FHEM",AttrVal("global", "modpath","")."/FHEM");

oder auch gerne anders.

Momentan stirbt mir FHEM bei jedem Aufruf von help <module> immer wegen dem die() komplett.

Vielen Dank

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

betateilchen

Hallo Markus,

Änderung habe ich gerade eingeckeckt, kannst Du die mal bitte testen?


    my $modPath = AttrVal('global','modpath','.');
    my @modDir = ("$modPath/FHEM");


Viele Grüße
Udo
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Markus Bloch

Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

betateilchen

Zitat von: rudolfkoenig am 18 Februar 2015, 18:41:59
Bemerkungen:
- man koennte einige Abschnitte aus doc/commandref.html anzeigen, wie global, command, devspec, attributes und perl, auch weil man in FHEMWEB im global-Detailansicht "help global" aufgerufen wird. Falls deswegen commandref_frame.html angepasst werden muss,

Ab dem morgigen Update ist dann auch "help global" möglich. Die Informationen lese ich direkt aus den commandref_frame Dateien, weil die sehr viel kleiner sind als die komplette commandref.html.

Zu diesem Zweck habe ich in den frames am Ende von "global" einfach eine html-Kommentarzeile eingefügt. Diese stört nicht bei der Erzeugung der commandref und ich kann sie problemlos als Endekriterium für das Lesen des Abschnitts verwenden.

Wegen "help command": Da habe ich im Moment das Problem, dass nicht alle commands dort aufgeführt sind. Und es werden auch in der "einfachen" help nicht alle verfügbaren Befehle ausgegeben, sondern nur diejenigen, die entweder fest in fhem.pl eingebaut sind oder deren Moduldateien bereits einmal geladen wurden, weil der Befehl schonmal ausgeführt wurde. Irgendwie suche ich da noch eine "gute" Lösung.

Für devspec, attr und perl könnte ich vermutlich ein ähnliches Verfahren wie für "global" implementieren.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Haken: commandref_frame*.html ist (noch?) nicht Teil des updates. :)

Vielleicht koennte in diesem Zusammenhang das update von commandref.html ausgebaut werden, und stattdessen commandref_join.pl vom lokalen FHEM-Rechner ausgefuehrt werden. Leider wird commandref_join.pl auch noch nicht mit update verteilt :)

Wenn du mit commands sowas wie help und update meinst, dann wuerde ich zunaechst nach einem Modul mit dem gleichen Namen suchen, und dann den Eintrag in commandref_frame. Befehle, die nicht in der passenden Datei sind, koennten ein Eintrag in %cmds hinterlegen  (SourceModule => "XXX").

betateilchen

Ich hab jetzt erstmal folgende Abschnitte noch mit eingebaut:

attributes, command, commands, devspec, global, perl

Das Lesen auf commendref.html umzubauen, ist kein großer Akt, an die update-Problematik habe ich nicht gedacht.

Zitat von: rudolfkoenig am 20 Februar 2015, 18:51:46
Vielleicht koennte in diesem Zusammenhang das update von commandref.html ausgebaut werden, und stattdessen commandref_join.pl vom lokalen FHEM-Rechner ausgefuehrt werden. Leider wird commandref_join.pl auch noch nicht mit update verteilt :)

Falls Du solch einen Umbau irgendwann umgesetzt hast, kann ich ja wieder problemlos aus den frames lesen :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Benni

Hallo Udo,

hatte eben ein reproduzierbares, Absturz-Erlebnis bei help. Beim Rumprobieren ist mir nach Eingabe von

help webViewControl
FHEM hängen geblieben. (Ja, ich weiß, dass das falsch ist und nix kommen dürfte)

Im Log findet sich danach dann noch folgender Eintrag:

Zitat2015.02.21 08:35:49 1: PERL WARNING: Deep recursion on subroutine "main::CommandHelp" at ./FHEM/98_help.pm line 81.

Es bleibt nur noch der Neustart von FHEM von der shell aus.

Wenn ich allerdings

help blahblah

eingebe passiert das nicht es nicht, ich erhalte lediglich die Meldung, dass das Modul blahblah nicht geladen sei.

Vermutung: er findet oben zwar das geladene Modul WebViewControl, aber es gibt keinen passenden Eintrag in der Hilfe, der dazu gelesen werden könnte.

Gruß Benni.

betateilchen

Das ist ein Sonderfall, den ich nicht bedacht habe:

webviewcontrol ist mit Stand von heute kein offiziell von fhem ausgeliefertes Modul und hat keine Doku.

Die Hilfe geht aber derzeit davon aus, dass jedes in /FHEM/ vorhandendes Modul die Pflichtanforderung erfüllt, eine Doku zumindest in englisch zu besitzen.

Diesen Sonderfall werde ich noch abfangen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: betateilchen am 21 Februar 2015, 10:00:53
Diesen Sonderfall werde ich noch abfangen.

erledigt.

Zitat von: rudolfkoenig am 18 Februar 2015, 18:41:59
- help im telnet ist noch ziemlich unverstaendlich, siehe "help at" oder "help notify".

Das liegt aber primär an der Gestaltung der commandref-Texte in den jeweiligen Modulen selbst.
Eines der Hauptprobleme, das die Unleserlichkeit verursacht, sind fehlende <br> tags am Zeilenende, insbesondere in <pre>-Blöcken (z.B. in at)

Ich habe testweise den <pre> Block in 90_at.pm durch einen <code> Block mit <br> an den Zeilenenden, dann werden auch die Beispiele in telnet korrekt dargestellt.

html-formatierte Texte lassen sich nicht ohne weiteres in optisch "schöne" plain-Texte umwandeln. Auch nicht mit zusätzlichen perl Modulen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Ab sofort wird per update ausgeliefert: contrib/commandref_join.pl, docs/commandref_frame*.html, fhem.cfg.demo, demolog/*

Habe update erweitert, dass beim vorhandensein von commandref_join.pl die commandref.html nicht herunterlaedt, sondern es selbst generiert. Vorteil: eigene und third-party Module werden ins commandref.html integriert, und man laedt bei einem update 2.5MB weniger von fhem.de. Nachteil: Fehlermeldung, falls die eigene Utils.pm keine Doku enthaelt, und commandref_join.pl dauert auf einem Fritzbox schonmal 1-2 Minuten. Habe immerhin "this may take a while" hingeschrieben, bin gespannt, wieviele es ignorieren werden. Habs auf einem Fritzbox und auf einem "richtigen" Rechner getestet.

Ich habe FHEMWEB.pm geaendert, damit das Output von help nicht nachbearbeitet wird. Koenntest du bitte
- jede Zeile mit einem \n abschliessen, damit <pre> ordentlich ausschaut (Beispiel ist help at)
- <html></html> entfernen, ist eh "Unsinn", da diese Tags an die falsche Stelle im Dokument eingebaut werden, und damit von allen Browsern nur ignoriert werden.

ZitatDas liegt aber primär an der Gestaltung der commandref-Texte in den jeweiligen Modulen selbst.
Das meinte ich nicht. Wenn ich z.Zt. "help at" im telnet eingebe, dann kriege ich

<html> Start an arbitrary FHEM command at a later time.



<timespec> format: [+][*{N}]<timedet>


statt

Start an arbitrary FHEM command at a later time.

Define
define <name> at <timespec> <command>

<timespec> format: [+][*{N}]<timedet>


d.h. die eigentliche definition wurde verschluckt. Das waere aber mAn wichtig zu zeigen.

betateilchen

Zitat von: rudolfkoenig am 21 Februar 2015, 23:24:44
- <html></html> entfernen, ist eh "Unsinn", da diese Tags an die falsche Stelle im Dokument eingebaut werden, und damit von allen Browsern nur ignoriert werden.

Bisher was das kein Unsinn, sondern zwingend notwendig, damit fhemweb diesen output als html überhaupt darstellt.
Und bisher war es auch so, dass ein output, der irgendwo \n enthielt, in fhemweb völliges Chaos verursachte...

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

betateilchen

Deine Vorschläge und Umbauten bringen nicht sonderlich viel:


  • ein Anhängen von \n bewirkt keine Änderung an der verkorksten Ausgabe von at (sogar im Frontend herrscht Chaos)
  • das Entfernen von <html></html> verändert auch nichts
  • der Aufruf von help ohne Modulname funktioniert nicht mehr
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

das <html></html> ist der indikator damit fhemweb weiss das ein modul html ausgibt das nicht weiter durch FW_htmlEscape geschickt oder anderweitig bearbeitet werden soll. nach dem erkennen könnte man das tag noch abschneiden und nicht an den browser durchreichen.

das tag sollte aber nur beim aufruf von help aus fhemweb aus angehängt werden. nicht beim aufruf per telnet. so war das zumindest bisher.

der <html> tag wird übrigens auch von list verwendet um in fhemweb die klickbaren links einzubauen.




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

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

betateilchen

in der telnet-Ausgabe kommt ohnehin kein <html> mit.

Aber im Moment ist die help-Ausgabe durch Rudis Änderungen bei der Ausgabe ziemlich kaputt :(

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

rudolfkoenig

Zitatein Anhängen von \n bewirkt keine Änderung an der verkorksten Ausgabe von at (sogar im Frontend herrscht Chaos)
Diese Aussage ist falsch, mit folgenden patch
@@ -140,7 +140,7 @@
      } elsif($l =~ m/^=end html$lang$/) {
         $skip = 1;
      } elsif(!$skip) {
-        $output .= $l;
+        $output .= $l."\n";
      }
    }
    return $output;

ist die Anzeige von "help at" korrekt, siehe Anhang.

Zitatdas Entfernen von <html></html> verändert auch nichts
der Aufruf von help ohne Modulname funktioniert nicht mehr
Ich habe das <html> von andre falsch verstanden (soll signalisieren, dass der Rueckgabewert html ist), und help war der erste Anwendungsfall dafuer, auch wenn es vor knapp einem Jahr eingebaut wurde. Leider war die Pruefung fehlerhaft, und hat Mehrzeiler nicht erwischt. Habs korrigiert, mit dem Ergebnis, dass "help" ohne Argument wieder funktioniert. Mit Argument hat es auch vorher getan.

Zitatin der telnet-Ausgabe kommt ohnehin kein <html> mit.
Entspricht nicht meiner Erfahrung:
fhem> help at
<html>
<h3>at</h3>
...
<html>
fhem>

rudolfkoenig

Leider muss durch meine letzte Aenderung betateilchen das help Modul wieder anpassen.
Also: help soll bleiben wie heute frueh, nur die Newlines haette ich gerne auch im HTML Fall.

Sorry fuer die Verwirrung.


betateilchen

#36

  • help ohne Paramter liefert jetzt auch html output. Und das in einem vernünftigen Format (im Gegensatz zu früher) in dem auch die einzelnen Spalten erkennbar und ordentlich lesbar sind.
  • das \n habe ich eingebaut
  • telnet liefert kein <html> mehr, das war lediglich ein vergessenes Überbleibsel aus dem Rekursionsumbau von gestern.
  • das Aussehen der Hilfetexte in telnet hat für mich nicht oberste Priorität


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

rudolfkoenig

Zitathast du dir das mit dem scrollTop noch mal angeschaut?
Ja, fand es aber verwirrend, wenn die Seite nach dem Click ploetzlich anders ausschaut.
Ich sehe aber ein, dass auch lange Detailseiten gibt, und habe es deswegen mit etwas Animation eingebaut.

Zitatapropos links: im darkstyle sind die ganzen links nicht zu erkennen.
Der Autor von darkstyle (wer war das eigentlich?) hat es bestimmt, dass Links nur bei hover  wahrnembar sind.
Ich will da nicht reinreden, vorallem ist mir der Fix nicht offensichtlich.

betateilchen

Ich hatte ja grade mal wieder ein paar Stunden Bahn-Fahrzeit und da habe ich fleißig am help-Modul weitergebastelt.

Alles was als "commands" anzusehen ist, wird nun aus drei Quellen ermittelt:


  • alles, was in der fhem.pl bereits als Hilfetexte in %cmds definiert wird
  • alles, was in commandref_frame.html in der Liste "commands" steht
  • alles, was ich im Modul selbst als command definiert habe (global, devspec, perl etc)

Standardmäßig wird bei noch nicht geladenen Command-Modulen ein Hilfetext "use "help <command>" for more info" ausgegeben. Wurde das Modul bereits geladen, steht der vom Modul vorgegebene Hilfe-Kurztext in der Ausgabe.

Funktioniert soweit auch alles ganz gut, es gibt aber auch da wieder ein paar Ausreißer:


  • Die als commands in der commandref_frame definierten Befehle "createlog" und "usb" passen nicht in diese Logik, da sie eigentlich aus dem Modul autocreate stammen und ihre Beschreibung sich auch dort befindet.
  • Das Modul apptime, für das es in der Maintainer.txt keinen Eintrag gibt (wenn ich es nicht übersehen habe) hält sich nicht an die Syntax für den Hilfetext, der eine Trennung zwischen Parameter und Text mittels Komma vorsieht.


Ich werde noch ein bisschen testen und die neue Modulversion vermutlich heute abend noch einchecken.


Zitat
Possible commands:

Command        Parameter
               Description
----------------------------------------------------------------------
CULflash       use "help CULflash" for more help                 
               
IF             use "help IF" for more help                       
               
JsonList       use "help JsonList" for more help                 
               
JsonList2      use "help JsonList2" for more help               
               
apptime        use "help apptime" for more help                 
               
attr           <devspec> <attrname> [<attrval>]
               set attribute for <devspec>
attributes     use "help attributes" for more help               
               
backup         use "help backup" for more help                   
               
cmdalias       use "help cmdalias" for more help                 
               
command        use "help command" for more help                 
               
commands       use "help commands" for more help                 
               
configdb       use "help configdb" for more help                 
               
copy           use "help copy" for more help                     
               
createlog      use "help createlog" for more help               
               
define         <name> <type> <options>         
               define a device/at/notify entity
delete         <devspec>                                   
               delete the corresponding definition(s)
deleteattr     <devspec> [<attrname>]               
               delete attribute for <devspec>
deletereading  <devspec> [<attrname>]               
               delete user defined reading for <devspec>
devspec        use "help devspec" for more help                 

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

rudolfkoenig

Ich habe usb und createlog in fhem.pl %cmds mit einem ModuleName Eintrag angelegt, was auf dem Quell-Modul verweist. AnalyzeCommand wertet es aus, d.h. autocreate wird geladen (falls das noch nicht der Fall war), wenn man usb eintippt. Evtl. koennte man das beim help auch beruecksichtigen.

Btw: wenn man im telnet help ohne Argument eingibt, dann kommt was schwer lesbares zurueck, was mit vielen HTML Tags versehen ist. Wg. apptime muss vmtl. Martin (HM) dran.

betateilchen

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

betateilchen

Zitat von: rudolfkoenig am 01 März 2015, 14:01:02
Btw: wenn man im telnet help ohne Argument eingibt, dann kommt was schwer lesbares zurueck, was mit vielen HTML Tags versehen ist.

Habe ich gerade gefixt.

Zitat von: rudolfkoenig am 01 März 2015, 14:01:02
Ich habe usb und createlog in fhem.pl %cmds mit einem ModuleName Eintrag angelegt, was auf dem Quell-Modul verweist. AnalyzeCommand wertet es aus, d.h. autocreate wird geladen (falls das noch nicht der Fall war), wenn man usb eintippt. Evtl. koennte man das beim help auch beruecksichtigen.

Dazu habe ich aktuell noch keine Idee, aber ich habe mich auch noch nicht intensiv damit befaßt. Irgendwas wird mir dazu sicher noch einfallen.

Zitat von: rudolfkoenig am 01 März 2015, 14:01:02
Wg. apptime muss vmtl. Martin (HM) dran.

Das fehlende Komma habe ich neulich schon eingebaut.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: rudolfkoenig am 01 März 2015, 14:01:02
Ich habe usb und createlog in fhem.pl %cmds mit einem ModuleName Eintrag angelegt, was auf dem Quell-Modul verweist.

Wann und wo sollte ich denn den Eintrag ModuleName finden?

Wenn ich mir aktuell die %cmds ausgeben lasse, bekomme ich nur folgende Infos:



$VAR13 = 'createlog';
$VAR14 = {
           'Hlp' => '<device>,create log/weblink for <device>',
           'Fn' => 'CommandCreateLog'
         };

$VAR31 = 'usb';
$VAR32 = {
           'Hlp' => '[scan|create],display or create fhem-entries for USB devices',
           'Fn' => 'CommandUsb'
         };


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

rudolfkoenig

Sorry, mein Fehler.
Die Eintraege gibts in fhem.pl, sie werden beim Laden von autocreate.pm ueberschrieben.
Da ich das Laden testen wollte, habe ich autocreate nicht definiert, und nach dem Laden war ich ja happy, dass ich fertig bin.

Habe autocreate.pm angepasst und eingecheckt.

betateilchen

Ok, hab ich jetzt eingebaut. Bei "help usb" und "help createlog" wird nun der Hilfetext von autocreate geladen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!