2016-11-06 2 views
1

Ich habe eine Elektronen-App, wo ich Ace-Editor verwende. Wie ich in einem früheren Post gesagt habe, lese ich in meiner App Dateien, überprüfe den Inhalt und markiere Zeilen, die übersetzt werden können. Alles funktioniert gut. Wenn die Benutzer die Texte übersetzen, speichere ich sie in einer Datenbank. Wenn der Benutzer also eine Datei öffnet, die zuvor übersetzt wurde, überprüfe ich die "übersetzten" Texte und ersetze diese Zeilen für den eigentlichen Übersetzungstext. Alles funktioniert gut. Einige Dateien benötigen jedoch zu viel Zeit zum Laden.Wie Optimize Ace Editor ersetzen Funktion?

Dies ist das Ersetzen von Segment-Code:

insertTranslateLines:function(trasnlate,linea,idMarker,inline,item){ 

     // console.log($this.__time($this.start),"ak",linea); 
     var currentLine = $this.obtLinea(linea); 
     trasnlateStr = trasnlate.trasnlate; 
     if(inline || $this.lineaEnComillas(currentLine)){ 
      trasnlateStr = trasnlate.trasnlate.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); 

      if(!inline){ 
       var endReemplazo= currentLine.lastIndexOf("\""); 
       var startLine = currentLine.indexOf("\"")+1; 
       var partEnd  = startLine + trasnlateStr.length; 
      } 
      else{ 
       var texto  = currentLine.match($this.expresiones.cadenaTraducir2); 
       var startLine = currentLine.indexOf(texto[item])+1;//se suma uno para eliminar la comilla 
       var partEnd  = startLine + trasnlateStr.length; 
       var endReemplazo= startLine + texto[item].length-2;//se restan las comillas 
       // texto = currentLine.split($this.expresiones.cadenaTraducirSplit); 

      }    

      highLightRange = $this.setRange(linea,startLine,linea,partEnd); 
      replaceRange = $this.setRange(linea,startLine,linea,endReemplazo); 
      // $this.editorActual.session.replace(replaceRange,trasnlateStr); 
     }else{ 
      replaceRange = $this.setRange(linea,0,linea,currentLine.length); 
      highLightRange = $this.setRange(linea,0,linea,trasnlateStr.length);  
     } 
     token = $this.editorActual.session.bgTokenizer.getTokens(linea,0); 

     // $this.editorActual.session.replace(replaceRange,trasnlateStr); 
     if(typeof highLightRange!='undefined'){ 
      $this 
       .registerTrasnlate(idMarker,highLightRange); 
      if(token[0].type!='comment') 
      { 
       $this.setMarker(idMarker,highLightRange); 
      } 


      return highLightRange; 
     }else return false; 



} 

Der folgende Code ist ein Verfahren von meinem JavaScript-Objekt ist. $ Dies ist ein Alias ​​für (dies (Objektumfang)). Diese Methode ruft die Zeile ab, in der ein Text übersetzt und aus dem ursprünglichen Text ersetzt wurde. Wie gesagt, bisher läuft alles gut, aber der Prozess braucht viel Zeit. Testen sie, ** I die nächste Zeile erkannt haben, ist das Problem: **

$this.editorActual.session.replace(replaceRange,trasnlateStr); 

Wie Sie sehen, diese Linie war bei dem ersten Segment des Codes, sondern „kommentiert“. Wenn ich diese Zeile kommentiere, wird die Datei in 391 Millisekunden geladen. aber wenn ich die Zeile auskomme, lädt die Datei zwischen 45000 und 60000 Millisekunden (kann mehr sein, die Zeit hängt von der Dateigröße ab). Die Dateien haben zwischen 1000 und 1800 Zeilen.

"$ this.editorActual" ist meine Ass-Editor-Instanz. Ich habe nur die "session.replace" als Methode zum Ersetzen von Texten gefunden, und logischerweise ohne diese Zeile funktioniert meine App nicht. Also, ich würde gerne wissen, ob es einen anderen schnellsten Weg gibt, um die Linien zu ersetzen? Wan zu wissen. Es gibt einen anderen schnellsten Weg, um die Linien zu ersetzen?

Antwort

1

Ersetzen ist langsam, weil es Geschichte in Manager rückgängig machen und Ereignisse erstellen muss. Sie können Übersetzungen in der Zeichenkette ersetzen, bevor Sie setValue aufrufen oder die Sitzung starten

+0

Hallo, Tanks für aswer. Der Gedanke ist, dass ich das "highlighting" als Werkzeug benutzte, um die Linien zu identifizieren. Sie sagten, dass ich den Text widthout den Ace-Editor verwenden muss? oder gibt es eine Möglichkeit, es ohne die "Sitzung" zu verwenden? – jrodriguez

+0

Wie viele Highlight-Bereiche haben Sie und wie werden sie aktualisiert, wenn der Text geändert wird? Das Problem kann mit dem Hinzufügen vieler Anker zusammenhängen. In diesem Fall werden mehr Informationen benötigt. –

+0

Es hängt davon ab, aber es kann eine Menge Texte geben. Ich denke, dass die Antwort der richtige Weg ist, und ich modifiziere meine App-Logik und ersetze den gesamten Text, bevor ich ihn in den ace Editor einfüge. Dieser Weg ist schneller als ich es tat. Vielen Dank – jrodriguez