Pārlūkot izejas kodu

Editor: Added script syntax validator.

Mr.doob 10 gadi atpakaļ
vecāks
revīzija
b348cd01ec
4 mainītis faili ar 303 papildinājumiem un 4 dzēšanām
  1. 16 0
      editor/css/main.css
  2. 1 0
      editor/index.html
  3. 89 4
      editor/js/Script.js
  4. 197 0
      editor/js/libs/esprima.js

+ 16 - 0
editor/css/main.css

@@ -67,6 +67,8 @@ textarea, input { outline: none; } /* osx */
 		display: none;
 	}
 
+/* CodeMirror */
+
 .CodeMirror {
 
 	position: absolute !important;
@@ -76,6 +78,20 @@ textarea, input { outline: none; } /* osx */
 
 }
 
+	.CodeMirror .errorLine {
+
+		background: rgba(255,0,0,0.25);
+
+	}
+
+	.CodeMirror .esprima-error {
+
+		color: #f00;
+		text-align: right;
+		padding: 0px 20px;
+
+	}
+
 /* scene types */
 
 .type {

+ 1 - 0
editor/index.html

@@ -41,6 +41,7 @@
 		<link rel="stylesheet" href="js/libs/codemirror/theme/monokai.css">
 		<script src="js/libs/codemirror/codemirror.js"></script>
 		<script src="js/libs/codemirror/mode/javascript.js"></script>
+		<script src="js/libs/esprima.js"></script>
 
 		<script src="js/libs/jszip.min.js"></script>
 		<script src="js/libs/sortable.min.js"></script>

+ 89 - 4
editor/js/Script.js

@@ -15,7 +15,7 @@ var Script = function ( editor ) {
 	var header = new UI.Panel();
 	header.setPadding( '10px' );
 	container.add( header );
-	
+
 	var title = new UI.Text().setColor( '#fff' );
 	header.add( title );
 
@@ -59,16 +59,101 @@ var Script = function ( editor ) {
 		clearTimeout( delay );
 		delay = setTimeout( function () {
 
-			currentScript.source = codemirror.getValue();
+			var value = codemirror.getValue();
+
+			if ( validate( value ) ) {
+
+				currentScript.source = value;
+				signals.scriptChanged.dispatch( currentScript );
 
-			signals.scriptChanged.dispatch( currentScript );
+			}
 
 		}, 300 );
 
 	});
 
+	// validate
+
+	var errorLines = [];
+	var widgets = [];
+
+	var validate = function ( string ) {
+
+		var syntax, errors;
+
+		return codemirror.operation( function () {
+
+			while ( errorLines.length > 0 ) {
+
+				codemirror.removeLineClass( errorLines.shift(), 'background', 'errorLine' );
+
+			}
+
+			for ( var i = 0; i < widgets.length; i ++ ) {
+
+				codemirror.removeLineWidget( widgets[ i ] );
+
+			}
+
+			widgets.length = 0;
+
+			//
+
+			try {
+
+				syntax = esprima.parse( string, { tolerant: true } );
+				errors = syntax.errors;
+
+				for ( var i = 0; i < errors.length; i ++ ) {
+
+					var error = errors[ i ];
+
+					var message = document.createElement( 'div' );
+					message.className = 'esprima-error';
+					message.textContent = error.message.replace(/Line [0-9]+: /, '');
+
+					var lineNumber = error.lineNumber - 1;
+					errorLines.push( lineNumber );
+
+					codemirror.addLineClass( lineNumber, 'background', 'errorLine' );
+
+					var widget = codemirror.addLineWidget(
+						lineNumber,
+						message
+					);
+
+					widgets.push( widget );
+
+				}
+
+			} catch ( error ) {
+
+				var message = document.createElement( 'div' );
+				message.className = 'esprima-error';
+				message.textContent = error.message.replace(/Line [0-9]+: /, '');
+
+				var lineNumber = error.lineNumber - 1;
+				errorLines.push( lineNumber );
+
+				codemirror.addLineClass( lineNumber, 'background', 'errorLine' );
+
+				var widget = codemirror.addLineWidget(
+					lineNumber,
+					message
+				);
+
+				widgets.push( widget );
+
+			}
+
+			return errorLines.length === 0;
+
+		});
+
+	};
+
 	//
-	
+
 	signals.editorCleared.add( function () {
 
 		container.setDisplay( 'none' );

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 197 - 0
editor/js/libs/esprima.js


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels