如何优化ace编辑器替换功能?
How Optimize ace editor replace function?
我有一个电子应用程序,我在其中使用 ace 编辑器。正如我在之前 post 中所说,在我的应用程序中,我读取文件、检查内容并标记可以翻译的行。一切正常。当用户翻译文本时,我将其保存在数据库中,这样,如果用户打开一些以前翻译过的文件,我会检查 "translated" 文本并将这些行替换为实际的翻译文本。一切正常。但是,有些文件加载时间过长。
这是替换段代码:
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;
}
下面的代码是我的 javascript 对象的一个方法。 $this 是 (this (object scope)) 的别名。此方法获取包含已从原始文本翻译和替换的文本的行。正如我之前所说,到目前为止一切正常,但这个过程需要很多时间。测试它,**我检测到下一行是问题所在:**
$this.editorActual.session.replace(replaceRange,trasnlateStr);
如您所见,此行位于代码的第一段,但 "commented"。如果我评论这一行,文件将在 391 毫秒内加载。但如果我取消注释该行,文件加载时间在 45000 到 60000 毫秒之间(可能更长,时间因文件大小而异)。这些文件有 1000 到 1800 行。
"$this.editorActual" 是我的 ace 编辑器实例。我只发现 "session.replace" 作为替换文本的方法,从逻辑上讲,如果没有这一行,我的应用程序将无法运行。所以,我想知道是否有另一种最快的方法来替换线路?想知道。还有另一种最快的替换线路的方法吗?
替换很慢,因为它必须在撤消管理器中保留历史记录并创建事件。您可以在调用 setValue 或创建会话之前替换字符串上的翻译
我有一个电子应用程序,我在其中使用 ace 编辑器。正如我在之前 post 中所说,在我的应用程序中,我读取文件、检查内容并标记可以翻译的行。一切正常。当用户翻译文本时,我将其保存在数据库中,这样,如果用户打开一些以前翻译过的文件,我会检查 "translated" 文本并将这些行替换为实际的翻译文本。一切正常。但是,有些文件加载时间过长。
这是替换段代码:
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;
}
下面的代码是我的 javascript 对象的一个方法。 $this 是 (this (object scope)) 的别名。此方法获取包含已从原始文本翻译和替换的文本的行。正如我之前所说,到目前为止一切正常,但这个过程需要很多时间。测试它,**我检测到下一行是问题所在:**
$this.editorActual.session.replace(replaceRange,trasnlateStr);
如您所见,此行位于代码的第一段,但 "commented"。如果我评论这一行,文件将在 391 毫秒内加载。但如果我取消注释该行,文件加载时间在 45000 到 60000 毫秒之间(可能更长,时间因文件大小而异)。这些文件有 1000 到 1800 行。
"$this.editorActual" 是我的 ace 编辑器实例。我只发现 "session.replace" 作为替换文本的方法,从逻辑上讲,如果没有这一行,我的应用程序将无法运行。所以,我想知道是否有另一种最快的方法来替换线路?想知道。还有另一种最快的替换线路的方法吗?
替换很慢,因为它必须在撤消管理器中保留历史记录并创建事件。您可以在调用 setValue 或创建会话之前替换字符串上的翻译