| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | (function() {  var bogus = [ "Dangerous comment" ];  var warnings = [ [ "Expected '{'",		     "Statement body should be inside '{ }' braces." ] ];  var errors = [ "Missing semicolon", "Extra comma", "Missing property name",	         "Unmatched ", " and instead saw", " is not defined",	         "Unclosed string", "Stopping, unable to continue" ];  function validator(options, text) {    JSHINT(text, options);    var errors = JSHINT.data().errors, result = [];    if (errors) parseErrors(errors, result);    return result;  }  CodeMirror.javascriptValidatorWithOptions = function(options) {    return function(text) { return validator(options, text); };  };  CodeMirror.javascriptValidator = CodeMirror.javascriptValidatorWithOptions(null);  function cleanup(error) {    // All problems are warnings by default    fixWith(error, warnings, "warning", true);    fixWith(error, errors, "error");    return isBogus(error) ? null : error;  }  function fixWith(error, fixes, severity, force) {    var description, fix, find, replace, found;    description = error.description;    for ( var i = 0; i < fixes.length; i++) {      fix = fixes[i];      find = (typeof fix === "string" ? fix : fix[0]);      replace = (typeof fix === "string" ? null : fix[1]);      found = description.indexOf(find) !== -1;      if (force || found) {	error.severity = severity;      }      if (found && replace) {	error.description = replace;      }    }  }  function isBogus(error) {    var description = error.description;    for ( var i = 0; i < bogus.length; i++) {      if (description.indexOf(bogus[i]) !== -1) {	return true;      }    }    return false;  }  function parseErrors(errors, output) {    for ( var i = 0; i < errors.length; i++) {      var error = errors[i];      if (error) {	var linetabpositions, index;	linetabpositions = [];	// This next block is to fix a problem in jshint. Jshint	// replaces	// all tabs with spaces then performs some checks. The error	// positions (character/space) are then reported incorrectly,	// not taking the replacement step into account. Here we look	// at the evidence line and try to adjust the character position	// to the correct value.	if (error.evidence) {	  // Tab positions are computed once per line and cached	  var tabpositions = linetabpositions[error.line];	  if (!tabpositions) {	    var evidence = error.evidence;	    tabpositions = [];	    // ugggh phantomjs does not like this	    // forEachChar(evidence, function(item, index) {	    Array.prototype.forEach.call(evidence, function(item,							    index) {	      if (item === '\t') {		// First col is 1 (not 0) to match error		// positions		tabpositions.push(index + 1);	      }	    });	    linetabpositions[error.line] = tabpositions;	  }	  if (tabpositions.length > 0) {	    var pos = error.character;	    tabpositions.forEach(function(tabposition) {	      if (pos > tabposition) pos -= 1;	    });	    error.character = pos;	  }	}	var start = error.character - 1, end = start + 1;	if (error.evidence) {	  index = error.evidence.substring(start).search(/.\b/);	  if (index > -1) {	    end += index;	  }	}	// Convert to format expected by validation service	error.description = error.reason;// + "(jshint)";	error.start = error.character;	error.end = end;	error = cleanup(error);	if (error)          output.push({message: error.description,                       severity: error.severity,                       from: CodeMirror.Pos(error.line - 1, start),                       to: CodeMirror.Pos(error.line - 1, end)});      }    }  }})();
 |