mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-11-30 03:26:20 +00:00
96d4a3ecf7
Due to historical reasons, the code is in subfolder "1". With SVN removal, we place the code back and remove the annoying "1" folder.
137 lines
4.3 KiB
JavaScript
137 lines
4.3 KiB
JavaScript
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|
|
|
(function(mod) {
|
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|
mod(require("../../lib/codemirror"));
|
|
else if (typeof define == "function" && define.amd) // AMD
|
|
define(["../../lib/codemirror"], mod);
|
|
else // Plain browser env
|
|
mod(CodeMirror);
|
|
})(function(CodeMirror) {
|
|
"use strict";
|
|
// declare global: JSHINT
|
|
|
|
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(text, options) {
|
|
if (!window.JSHINT) return [];
|
|
JSHINT(text, options);
|
|
var errors = JSHINT.data().errors, result = [];
|
|
if (errors) parseErrors(errors, result);
|
|
return result;
|
|
}
|
|
|
|
CodeMirror.registerHelper("lint", "javascript", validator);
|
|
|
|
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)});
|
|
}
|
|
}
|
|
}
|
|
});
|