Hallo,
Dann stimmt höchstwahrscheinlich der Algorithmus nicht oder die Maschine ist nur ein 486er.
Ich nehme an, Andreas meint einen Algorithmus wie in </archiv/2004/9/t88864/#m530093> ff. (DOM oder innerHTML und RegExps). Vielleicht sollte er seinen Ansatz einmal in Codeform vorstellen. Ich glaube nicht, dass sich am grundlegenden Vorgehen viel optimieren lässt und glaube durchaus, dass solches Gefummel am Knotenbaum dermaßen lahm ist. Clientseitiges Scripting ist ein denkbar ungeeignetes Mittel für diese Aufgabe.
Durchsuchst Du das Array linear oder hast Du ein assoziatives Array gebastelt?
(Es gibt keine assoziativen Arrays in JavaScript.)
Ich hätte das so gelöst:
glossar = new Array();
(new Object())
glossar["wort1"] = "Definition für Wort 1";
glossar["wort2"] = "Definition für Wort 2";
glossar["wort3"] = "Definition für Wort 3";
...text = textknoten.split(" ");
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.
[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.
Wenn makeDFNNode nun direkt Änderungen am Knotenbaum vornimmt (siehe oben), kann zwar weiter mit dem text-Array gearbeitet werdne, es muss beachtet werden, dass der Anfang des Strings nun bei » d e« liegt. Wenn »d« im Glossar steht, müsste entsprechend herauskommen:
[a b ]-(DFN)-[ ]-(DFN)-[ e]
| |
[c] [d]
usw.
Leider wird dieser Ansatz prinzipiell schlecht funktionieren. Ein Text ist keine Liste von Lemmata, die durch Leerzeichen getrennt sind. 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).
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, das wird einen Fehler erzeugen. Es gibt das Keyword undefined, das ist aber eine ganz andere Geschichte, denn das bezieht sich auf absichtlich als undefined initialisierte Variablen (var bla;, nicht übergebene, aber in der Parameterliste aufgeführte Funktionsparameter). Dann gibt es den typeof-Operator, der unter anderem auch den String "undefined" zurückgeben kann. Der wäre hier wohl am sinnvollsten.
Mathias