Oliver Garcia: (ZUR INFO) SELFHTML: Offline-Suche verbessert

Hallo,

ich finde die Offline-Suche in SELFHTML so gut, daß ich sie für meine eigenen Dateien übernehmen will.
Zu diesem Zweck habe ich den Programmtext etwas umgeschrieben, und zwar so, daß auch anspruchsvollere Suchanfragen möglich sind.

Vielleicht möchte der eine oder andere die in SelfHTML eingebaute Suchfunktion verbessern. Dafür muß nur in der Datei Wsuchen.js die Funktion ListSearch() durch die unten angehängten 3 neuen Funktionen ausgetauscht werden.

Dadurch wird eine UND-Suche mit mehreren Suchkriterien ermöglicht, während bislang nur ein Kriterium angegeben werden konnte.

Beispiele für Suchanfragen:

  • CSS Listen
  • daten einbinden

Das Leerzeichen trennt die einzelnen Suchkriterien.
Wenn man, wie bisher, zusammenhängende Passagen als feststehenden Ausdruck suchen will, dann geht das auch noch, man muß dafür aber den Text in Anführungszeichen setzen.
Beispiel:
"abstände definieren"

Will man ganze Wörter suchen, dann muß man nun auch so vorgehen (Bsp: " zeile "), da ja Leerzeichen sonst als Trenner interpretiert werden.

Das Programm verlangt nun Javascript 1.2 statt 1.1, läuft also z.B. nicht in Netscape 3.
Und da es somit auf Kompabilität ohnehin nicht mehr ankommt, kann man es durch einen kleinen Eingriff noch weiter verbessern: Wenn man in der Funktion "found(str)" die Zeile
isfound = ( s.indexOf( q ) > -1 ) in
isfound = ( s.search( q ) > -1 )
ändert, dann kann man mit regulären Ausdrücken suchen, was viele weitere Möglichkeiten eröffnet. Auch ODER-Verknüpfungen sind dann möglich, z.B.: (cgi|perl).

Gruß,

Oliver

In "Wsuchen.js":
Statt "function ListSearch()" :
-----------------------------

function Suche(nr,elem) {
if (nr == 0) {
  return -1
}
else {
  query = such[nr]
  if (( found( Entry[elem].Title )
  ||   found( Entry[elem].Keywords )
  ||   found( Entry[elem].Description )
     ) && Suche(nr-1,elem)) {
      return -1
     }
}
}

function Kriterien(Eingabe)
{
Eingabe = noumlaut( Eingabe );
// erster Schritt: erkennen, daß Bereiche in Anführungszeichen
// _ein_ Kriterium sind
kl = Eingabe.match(/"[^"]*"/g)
such = new Array();
var x=0
if (kl) {
  for (x=0; x<=kl.length-1; x++) {
   such[x+1]=kl[x].replace(/"/g,"")
   Eingabe=Eingabe.replace(kl[x],"")
  }
}
// zweiter Schritt: jedes sonstige Wort ist ein Kriterium
var y=x
Teile = Eingabe.split(/ /)
var z = Teile.length
for (x=1; x<=z; x++) {
  such[y+x]=Teile[x-1]
}
return such.length-1
}

function ListSearch()
{

var count = 0;  
var elemente = Kriterien( INPUT.QueryForm.query.value)  

with ( OUTPUT )  
{  

open();
  writeln("<html>");

HTMLHeader();
  HTMLOpenBody();
  HTMLOpenFont();

write("Suche nach: <b>", INPUT.QueryForm.query.value, "</b> (", elemente );
  if (elemente>1)
   write(" Kriterien)" );
  else
   write(" Kriterium)" );
  
  writeln("<ol>");
  
  for (var i=1 ; i<Entry.length; i++)
  {
   if ( Suche(elemente,i) ) /* Einstieg in die rekursive Suche */
   {
    writeln("<li><p>");
    writeln( Entry[i].Format() );
    writeln("</p></li>");
    count++;
   }
  }
     writeln("</ol>");

if ( count == 0 )
     {
   writeln("<p>Es wurde kein Eintrag gefunden");
  }

writeln("<p><b>Die Suche ist abgeschlossen</b>" );
  HTMLCloseFont();
  HTMLCloseBody();
  writeln('</html>');
  close();
    }
}

  1. Hallo Oliver

    danke fuer Deinen interessanten Vorschlag!
    Ich hab das jetzt zwar noch nicht ausprobiert, hoffe aber, dass die Maschinisten mitlesen!

    viele Gruesse
      Stefan Muenz