(ZUR INFO) SELFHTML: Offline-Suche verbessert
Oliver Garcia
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:
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();
}
}
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