Просмотр исходного кода

Merge pull request #352 from sharelatex/bg-syntax-validator-fixes

syntax validator fixes
Brian Gough 10 лет назад
Родитель
Сommit
9389f97e41

+ 19 - 5
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

+ 28 - 8
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;

+ 1 - 1
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");
                     };