提交 b348cd01 编写于 作者: M Mr.doob

Editor: Added script syntax validator.

上级 9c126977
......@@ -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 {
......
......@@ -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>
......
......@@ -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' );
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册