From cb4380fa78c296cd3cb88e4b80d862559e097699 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Wed, 26 Oct 2016 12:01:49 +0100 Subject: [PATCH 1/2] fix problem with setting syntax validation option --- .../ide/editor/directives/aceEditor.coffee | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 87b525120f..0fdb806e83 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -15,9 +15,13 @@ define [ # set the path for ace workers if using a CDN (from editor.jade) if window.aceWorkerPath != "" + syntaxValidationEnabled = true ace.config.set('workerPath', "#{window.aceWorkerPath}") else - ace.config.setDefaultValue("session", "useWorker", false) + syntaxValidationEnabled = false + + # By default, don't use workers - enable them per-session as required + ace.config.setDefaultValue("session", "useWorker", false) # Ace loads its script itself, so we need to hook in to be able to clear # the cache. @@ -202,8 +206,12 @@ define [ editor.setReadOnly !!value scope.$watch "syntaxValidation", (value) -> - session = editor.getSession() - session.setOption("useWorker", value); + # ignore undefined settings here + # only instances of ace with an explicit value should set useWorker + # the history instance will have syntaxValidation undefined + if value? and syntaxValidationEnabled + session = editor.getSession() + session.setOption("useWorker", value); editor.setOption("scrollPastEnd", true) @@ -227,10 +235,16 @@ define [ catch mode = "ace/mode/text" - editor.setSession(new EditSession(lines, mode)) + # create our new session + session = new EditSession(lines, mode) - session = editor.getSession() session.setUseWrapMode(true) + # use syntax validation only when explicitly set + if scope.syntaxValidation? and syntaxValidationEnabled + session.setOption("useWorker", scope.syntaxValidation); + + # now attach session to editor + editor.setSession(session) doc = session.getDocument() doc.on "change", onChange From eab7d46fc5a93166fc3907115d73de58a88b4509 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Wed, 26 Oct 2016 15:15:18 +0100 Subject: [PATCH 2/2] update latex syntax validator (e4b016e) --- .../web/public/js/ace-1.2.5/mode-latex.js | 36 ++++++++++++++----- .../web/public/js/ace-1.2.5/worker-latex.js | 2 +- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/services/web/public/js/ace-1.2.5/mode-latex.js b/services/web/public/js/ace-1.2.5/mode-latex.js index c87324efe4..f183d7c263 100644 --- a/services/web/public/js/ace-1.2.5/mode-latex.js +++ b/services/web/public/js/ace-1.2.5/mode-latex.js @@ -214,18 +214,21 @@ var createLatexWorker = function (session) { var suppressions = []; var hints = []; var changeHandler = null; + var docChangePending = false; + var firstPass = true; var worker = new WorkerClient(["ace"], "ace/mode/latex_worker", "LatexWorker"); worker.attachToDocument(doc); - - doc.on("change", function () { + var docChangeHandler = doc.on("change", function () { + docChangePending = true; if(changeHandler) { clearTimeout(changeHandler); changeHandler = null; } }); - selection.on("changeCursor", function () { + var cursorHandler = selection.on("changeCursor", function () { + if (docChangePending) { return; } ; changeHandler = setTimeout(function () { updateMarkers({cursorMoveOnly:true}); suppressions = []; @@ -307,11 +310,20 @@ var createLatexWorker = function (session) { } } if (!cursorMoveOnly || suppressedChanges) { - session.setAnnotations(annotations); + if (firstPass) { + if (annotations.length > 0) { + var originalAnnotations = session.getAnnotations(); + session.setAnnotations(originalAnnotations.concat(annotations)); + }; + firstPass = false; + } else { + session.setAnnotations(annotations); + } }; }; worker.on("lint", function(results) { + if(docChangePending) { docChangePending = false; }; hints = results.data; if (hints.length > 100) { hints = hints.slice(0, 100); // limit to 100 errors @@ -319,14 +331,22 @@ var createLatexWorker = function (session) { updateMarkers(); }); worker.on("terminate", function() { + if(changeHandler) { + clearTimeout(changeHandler); + changeHandler = null; + } + doc.off("change", docChangeHandler); + selection.off("changeCursor", cursorHandler); for (var key in savedRange) { var range = savedRange[key]; - range.start.detach(); - range.end.detach(); + if (range.start !== cursorAnchor) { range.start.detach(); } + if (range.end !== cursorAnchor) { range.end.detach(); } session.removeMarker(range.id); - delete savedRange[key]; } - + savedRange = {}; + hints = []; + suppressions = []; + session.clearAnnotations(); }); return worker; diff --git a/services/web/public/js/ace-1.2.5/worker-latex.js b/services/web/public/js/ace-1.2.5/worker-latex.js index c933f8db5f..20c377dc83 100644 --- a/services/web/public/js/ace-1.2.5/worker-latex.js +++ b/services/web/public/js/ace-1.2.5/worker-latex.js @@ -1755,7 +1755,7 @@ var InterpretTokens = function (TokeniseResult, ErrorReporter) { }; if (endToken) { - TokenErrorFromTo(token, endToken, "invalid environment command" + text.substring(token[2], endToken[3] || endToken[2])); + TokenErrorFromTo(token, endToken, "invalid environment command " + text.substring(token[2], endToken[3] || endToken[2])); } else { TokenError(token, "invalid environment command"); };