javascript - ace编辑器如何优化替换功能?

标签 javascript ace-editor

我有一个电子应用程序,我在其中使用 ace 编辑器。正如我在上一篇文章中所说,在我的应用程序中,我读取文件,检查内容并标记可以翻译的行。一切正常。当用户翻译文本时,我将其保存在数据库中,因此,如果用户打开以前翻译过的某个文件,我会检查“已翻译”文本并将这些行替换为实际翻译文本。一切都运转良好。但是,有些文件加载​​时间太长。

这是替换段代码:

    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 (对象范围)) 的别名。此方法获取已从原始文本翻译并替换的文本所在的行。正如我之前所说,到目前为止一切都很好,但这个过程需要很多时间。测试它,**我检测到下一行是问题所在:**

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

如您所见,这一行位于代码的第一段,但已“注释”。如果我评论这一行,文件将在 391 毫秒内加载。但如果我取消注释该行,文件加载时间将在 45000 到 60000 毫秒之间(可以更多,时间因文件大小而异)。这些文件有 1000 到 1800 行。

“$this.editorActual”是我的 ace 编辑器实例。我只找到“session.replace”作为替换文本的方法,从逻辑上讲,如果没有这一行,我的应用程序将无法工作。所以,我想知道是否还有另一种最快的方法来更换线路?我想知道。还有另一种最快的方法来更换线路吗?

最佳答案

替换很慢,因为它必须在撤消管理器中保留历史记录并创建事件。您可以在调用 setValue 或创建 session 之前替换字符串的翻译

关于javascript - ace编辑器如何优化替换功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40454166/

相关文章:

javascript - 单击时,将短代码/bbcode 添加到文本区域?

javascript - React 中的可缩放元素

javascript - 奇怪的 jquery 动画行为

javascript - 平滑滑动 HTML div 相互替换

syntax-highlighting - ace 编辑器语法荧光笔中行尾的退出状态

javascript - ace 编辑器中是否有避免水平滚动条的选项?

javascript - 扩展 Array 类时如何覆盖构造函数?

angularjs - 大写的 ACE 编辑器自动完成关键字

ace-editor - MVC Razor 语法的 Ace 编辑器插件

javascript - IE9 和 Safari 5 中单页上的 2 个 ACE 编辑器