Hi,
Clientseitiges Scripting ist ein denkbar ungeeignetes Mittel für diese Aufgabe.
Und für viele andere Aufgaben auch. Aber mitunter läßt es sich leider nicht umgehen.
Allerdings: das Script soll ein S&R vollziehen. Das könnte man eigentlich auch schon vorher machen, oder? Leider sind ja rein gar keine Details vorhanden.
Durchsuchst Du das Array linear oder hast Du ein assoziatives Array gebastelt?
(Es gibt keine assoziativen Arrays in JavaScript.)
Ja, aber ich hatte keine Lust auf lange Erklärungen.
Die darf ich ja _jetzt_ auch getrost Dir überlassen ;-)
Ich hätte das so gelöst:
glossar = new Array();
(new Object())
Da im Grunde fast das gleiche dient es hier der Lesbarkeit.
An sich performant, aber man muss bedenken, dass man beim Erstellen der neuen Knoten eigentlich drei Strings für drei Textknoten braucht: Der String vom Anfang des Textknotens bis zum Wort, das Wort selbst, der String vom Wort bis zum Ende des Textknotens. Daraus wird dann ein Textknoten, ein Elementknoten mit dem Wort als Textknoten und ein weiterer Textknoten.
Ja, das ist natürlich korrekt, darunter geht's nicht.
[a b c d e]
Wenn »c« ersetzt wird:
[a b ]-(DFN)-[ d e]
|
[c]Wenn der Textknoten »a b c d e« aufgespalten wird, jedes Wort mit dem Glossar verglichen wird, ist beim Finden eines Treffers vor allem die Position des Wortes im String interessant, damit der String dreigeteilt werden kann. Beim Durchlaufen des text-Arrays müsste man z.B. durch das Addieren der Teilstringlängen also eine gegenwärtige Position im String ausrechnen.
Hier würde ich brutal verfahren und einfach das Textarray teilen, den DFN-Knoten einbauen und weiterfahren. Jeder weitere Fund wäre dann einmal der Anfangsabschnitt vom Textarray ab DFN-Knoten, der ist direkter Verwandter vom DFN bzw mit etwas Vorsorge lastChild vom Parent, dann der neue DFN-Knoten, dann der Rest vom Textarray falls vorhanden. Ad finitum. Längenzählung ist hierbei nicht nötig, da an "Sollbruchstellen" geteilt wird.
Macht es aber auch nicht gerade signifikant schneller, zugegeben ;-)
Leider wird dieser Ansatz prinzipiell schlecht funktionieren. Ein Text ist keine Liste von Lemmata, die durch Leerzeichen getrennt sind.
Das weiß man nicht, dazu fehlen die Informationen.
Aber dürfte wohl normaler Text sein, nehme ich auch an.
Daher müssen wahrscheinlich doch reguläre Ausdrücke herhalten, um erst einmal die Worte zu finden. Und selbst die können schwer direkt mit Glossareinträgen verglichen werden (Stichwort Flexion).
Tja, Stemming in Javascript wäre doch mal eine interessante Aufgabe ;-)
Aber stimmt schon: mein Vorschlag setzt natürlich voraus, das alle Daten im Vornherein bekannt sind.
Ich tendiere aber auch, wie bereits angedeutet, dazu Dir zuzustimmen: das ganze ist keine gute Idee, das sollte der Kollege anders lösen. Oder zumindest Einzelheiten verraten, damit man hier nicht so im Trübem fischen muß.
for(var i = 0;i < text.length;i++){
if(glossar[ text[i] ] != 'undefined')Soll das JavaScript sein? Nicht existente Objekte kann man nicht mit dem String "undefined" vergleichen,
Hä?
Argh! Jaja, so geht's *sigh*
Der hier:
war auf jeden Fall noch drin, als ich es ausprobiert hatte:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>Test</title></head><body>
<script type="text/javascript">
<!--
var glossar = new Array();
glossar["nix"]="definition nix";
glossar["Weg"]="Korrekt!";
var Satz = "Wer nicht vom rechten Weg abkommt bleibt auf der Strecke";
var Woerter = Satz.split(" ");
document.write("Ein Satz mit " + Woerter.length + " Wörtern.<br>");
document.write("typeof glossar[ bla ] = " + (typeof glossar['bla']) );
//-->
</script></body></html>
(Na? Kommt's bekannt vor? ;-)
Ja sowas _peinliches_ aber auch!
so short
Christoph Zurnieden