add options for cssLint
This commit is contained in:
parent
5016cc3305
commit
8c97bba86a
3 changed files with 51 additions and 390 deletions
|
|
@ -80,19 +80,13 @@ oop.inherits(Mode, TextMode);
|
||||||
worker.attachToDocument(session.getDocument());
|
worker.attachToDocument(session.getDocument());
|
||||||
|
|
||||||
worker.on("csslint", function(e) {
|
worker.on("csslint", function(e) {
|
||||||
var errors = [];
|
session.setAnnotations(e.data);
|
||||||
e.data.forEach(function(message) {
|
|
||||||
errors.push({
|
|
||||||
row: message.line - 1,
|
|
||||||
column: message.col - 1,
|
|
||||||
text: message.message,
|
|
||||||
type: message.type,
|
|
||||||
lint: message
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
session.setAnnotations(errors);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
worker.on("terminate", function() {
|
||||||
|
session.clearAnnotations();
|
||||||
|
});
|
||||||
|
|
||||||
return worker;
|
return worker;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8752,374 +8752,6 @@ CSSLint.addRule({
|
||||||
|
|
||||||
});
|
});
|
||||||
/*global CSSLint*/
|
/*global CSSLint*/
|
||||||
(function() {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace special characters before write to output.
|
|
||||||
*
|
|
||||||
* Rules:
|
|
||||||
* - single quotes is the escape sequence for double-quotes
|
|
||||||
* - & is the escape sequence for &
|
|
||||||
* - < is the escape sequence for <
|
|
||||||
* - > is the escape sequence for >
|
|
||||||
*
|
|
||||||
* @param {String} message to escape
|
|
||||||
* @return escaped message as {String}
|
|
||||||
*/
|
|
||||||
var xmlEscape = function(str) {
|
|
||||||
if (!str || str.constructor !== String) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
return str.replace(/[\"&><]/g, function(match) {
|
|
||||||
switch (match) {
|
|
||||||
case "\"":
|
|
||||||
return """;
|
|
||||||
case "&":
|
|
||||||
return "&";
|
|
||||||
case "<":
|
|
||||||
return "<";
|
|
||||||
case ">":
|
|
||||||
return ">";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
CSSLint.addFormatter({
|
|
||||||
//format information
|
|
||||||
id: "checkstyle-xml",
|
|
||||||
name: "Checkstyle XML format",
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return opening root XML tag.
|
|
||||||
* @return {String} to prepend before all results
|
|
||||||
*/
|
|
||||||
startFormat: function(){
|
|
||||||
return "<?xml version=\"1.0\" encoding=\"utf-8\"?><checkstyle>";
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return closing root XML tag.
|
|
||||||
* @return {String} to append after all results
|
|
||||||
*/
|
|
||||||
endFormat: function(){
|
|
||||||
return "</checkstyle>";
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns message when there is a file read error.
|
|
||||||
* @param {String} filename The name of the file that caused the error.
|
|
||||||
* @param {String} message The error message
|
|
||||||
* @return {String} The error message.
|
|
||||||
*/
|
|
||||||
readError: function(filename, message) {
|
|
||||||
return "<file name=\"" + xmlEscape(filename) + "\"><error line=\"0\" column=\"0\" severty=\"error\" message=\"" + xmlEscape(message) + "\"></error></file>";
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given CSS Lint results for a file, return output for this format.
|
|
||||||
* @param results {Object} with error and warning messages
|
|
||||||
* @param filename {String} relative file path
|
|
||||||
* @param options {Object} (UNUSED for now) specifies special handling of output
|
|
||||||
* @return {String} output for results
|
|
||||||
*/
|
|
||||||
formatResults: function(results, filename, options) {
|
|
||||||
var messages = results.messages,
|
|
||||||
output = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a source string for a rule.
|
|
||||||
* Checkstyle source strings usually resemble Java class names e.g
|
|
||||||
* net.csslint.SomeRuleName
|
|
||||||
* @param {Object} rule
|
|
||||||
* @return rule source as {String}
|
|
||||||
*/
|
|
||||||
var generateSource = function(rule) {
|
|
||||||
if (!rule || !('name' in rule)) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return 'net.csslint.' + rule.name.replace(/\s/g,'');
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (messages.length > 0) {
|
|
||||||
output.push("<file name=\""+filename+"\">");
|
|
||||||
CSSLint.Util.forEach(messages, function (message, i) {
|
|
||||||
//ignore rollups for now
|
|
||||||
if (!message.rollup) {
|
|
||||||
output.push("<error line=\"" + message.line + "\" column=\"" + message.col + "\" severity=\"" + message.type + "\"" +
|
|
||||||
" message=\"" + xmlEscape(message.message) + "\" source=\"" + generateSource(message.rule) +"\"/>");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
output.push("</file>");
|
|
||||||
}
|
|
||||||
|
|
||||||
return output.join("");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}());
|
|
||||||
/*global CSSLint*/
|
|
||||||
CSSLint.addFormatter({
|
|
||||||
//format information
|
|
||||||
id: "compact",
|
|
||||||
name: "Compact, 'porcelain' format",
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return content to be printed before all file results.
|
|
||||||
* @return {String} to prepend before all results
|
|
||||||
*/
|
|
||||||
startFormat: function() {
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return content to be printed after all file results.
|
|
||||||
* @return {String} to append after all results
|
|
||||||
*/
|
|
||||||
endFormat: function() {
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given CSS Lint results for a file, return output for this format.
|
|
||||||
* @param results {Object} with error and warning messages
|
|
||||||
* @param filename {String} relative file path
|
|
||||||
* @param options {Object} (Optional) specifies special handling of output
|
|
||||||
* @return {String} output for results
|
|
||||||
*/
|
|
||||||
formatResults: function(results, filename, options) {
|
|
||||||
var messages = results.messages,
|
|
||||||
output = "";
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Capitalize and return given string.
|
|
||||||
* @param str {String} to capitalize
|
|
||||||
* @return {String} capitalized
|
|
||||||
*/
|
|
||||||
var capitalize = function(str) {
|
|
||||||
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (messages.length === 0) {
|
|
||||||
return options.quiet ? "" : filename + ": Lint Free!";
|
|
||||||
}
|
|
||||||
|
|
||||||
CSSLint.Util.forEach(messages, function(message, i) {
|
|
||||||
if (message.rollup) {
|
|
||||||
output += filename + ": " + capitalize(message.type) + " - " + message.message + "\n";
|
|
||||||
} else {
|
|
||||||
output += filename + ": " + "line " + message.line +
|
|
||||||
", col " + message.col + ", " + capitalize(message.type) + " - " + message.message + "\n";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
/*global CSSLint*/
|
|
||||||
CSSLint.addFormatter({
|
|
||||||
//format information
|
|
||||||
id: "csslint-xml",
|
|
||||||
name: "CSSLint XML format",
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return opening root XML tag.
|
|
||||||
* @return {String} to prepend before all results
|
|
||||||
*/
|
|
||||||
startFormat: function(){
|
|
||||||
return "<?xml version=\"1.0\" encoding=\"utf-8\"?><csslint>";
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return closing root XML tag.
|
|
||||||
* @return {String} to append after all results
|
|
||||||
*/
|
|
||||||
endFormat: function(){
|
|
||||||
return "</csslint>";
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given CSS Lint results for a file, return output for this format.
|
|
||||||
* @param results {Object} with error and warning messages
|
|
||||||
* @param filename {String} relative file path
|
|
||||||
* @param options {Object} (UNUSED for now) specifies special handling of output
|
|
||||||
* @return {String} output for results
|
|
||||||
*/
|
|
||||||
formatResults: function(results, filename, options) {
|
|
||||||
var messages = results.messages,
|
|
||||||
output = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace special characters before write to output.
|
|
||||||
*
|
|
||||||
* Rules:
|
|
||||||
* - single quotes is the escape sequence for double-quotes
|
|
||||||
* - & is the escape sequence for &
|
|
||||||
* - < is the escape sequence for <
|
|
||||||
* - > is the escape sequence for >
|
|
||||||
*
|
|
||||||
* @param {String} message to escape
|
|
||||||
* @return escaped message as {String}
|
|
||||||
*/
|
|
||||||
var escapeSpecialCharacters = function(str) {
|
|
||||||
if (!str || str.constructor !== String) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return str.replace(/\"/g, "'").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
||||||
};
|
|
||||||
|
|
||||||
if (messages.length > 0) {
|
|
||||||
output.push("<file name=\""+filename+"\">");
|
|
||||||
CSSLint.Util.forEach(messages, function (message, i) {
|
|
||||||
if (message.rollup) {
|
|
||||||
output.push("<issue severity=\"" + message.type + "\" reason=\"" + escapeSpecialCharacters(message.message) + "\" evidence=\"" + escapeSpecialCharacters(message.evidence) + "\"/>");
|
|
||||||
} else {
|
|
||||||
output.push("<issue line=\"" + message.line + "\" char=\"" + message.col + "\" severity=\"" + message.type + "\"" +
|
|
||||||
" reason=\"" + escapeSpecialCharacters(message.message) + "\" evidence=\"" + escapeSpecialCharacters(message.evidence) + "\"/>");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
output.push("</file>");
|
|
||||||
}
|
|
||||||
|
|
||||||
return output.join("");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
/*global CSSLint*/
|
|
||||||
CSSLint.addFormatter({
|
|
||||||
//format information
|
|
||||||
id: "lint-xml",
|
|
||||||
name: "Lint XML format",
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return opening root XML tag.
|
|
||||||
* @return {String} to prepend before all results
|
|
||||||
*/
|
|
||||||
startFormat: function(){
|
|
||||||
return "<?xml version=\"1.0\" encoding=\"utf-8\"?><lint>";
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return closing root XML tag.
|
|
||||||
* @return {String} to append after all results
|
|
||||||
*/
|
|
||||||
endFormat: function(){
|
|
||||||
return "</lint>";
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given CSS Lint results for a file, return output for this format.
|
|
||||||
* @param results {Object} with error and warning messages
|
|
||||||
* @param filename {String} relative file path
|
|
||||||
* @param options {Object} (UNUSED for now) specifies special handling of output
|
|
||||||
* @return {String} output for results
|
|
||||||
*/
|
|
||||||
formatResults: function(results, filename, options) {
|
|
||||||
var messages = results.messages,
|
|
||||||
output = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace special characters before write to output.
|
|
||||||
*
|
|
||||||
* Rules:
|
|
||||||
* - single quotes is the escape sequence for double-quotes
|
|
||||||
* - & is the escape sequence for &
|
|
||||||
* - < is the escape sequence for <
|
|
||||||
* - > is the escape sequence for >
|
|
||||||
*
|
|
||||||
* @param {String} message to escape
|
|
||||||
* @return escaped message as {String}
|
|
||||||
*/
|
|
||||||
var escapeSpecialCharacters = function(str) {
|
|
||||||
if (!str || str.constructor !== String) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return str.replace(/\"/g, "'").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
||||||
};
|
|
||||||
|
|
||||||
if (messages.length > 0) {
|
|
||||||
|
|
||||||
output.push("<file name=\""+filename+"\">");
|
|
||||||
CSSLint.Util.forEach(messages, function (message, i) {
|
|
||||||
if (message.rollup) {
|
|
||||||
output.push("<issue severity=\"" + message.type + "\" reason=\"" + escapeSpecialCharacters(message.message) + "\" evidence=\"" + escapeSpecialCharacters(message.evidence) + "\"/>");
|
|
||||||
} else {
|
|
||||||
output.push("<issue line=\"" + message.line + "\" char=\"" + message.col + "\" severity=\"" + message.type + "\"" +
|
|
||||||
" reason=\"" + escapeSpecialCharacters(message.message) + "\" evidence=\"" + escapeSpecialCharacters(message.evidence) + "\"/>");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
output.push("</file>");
|
|
||||||
}
|
|
||||||
|
|
||||||
return output.join("");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
/*global CSSLint*/
|
|
||||||
CSSLint.addFormatter({
|
|
||||||
//format information
|
|
||||||
id: "text",
|
|
||||||
name: "Plain Text",
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return content to be printed before all file results.
|
|
||||||
* @return {String} to prepend before all results
|
|
||||||
*/
|
|
||||||
startFormat: function() {
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return content to be printed after all file results.
|
|
||||||
* @return {String} to append after all results
|
|
||||||
*/
|
|
||||||
endFormat: function() {
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given CSS Lint results for a file, return output for this format.
|
|
||||||
* @param results {Object} with error and warning messages
|
|
||||||
* @param filename {String} relative file path
|
|
||||||
* @param options {Object} (Optional) specifies special handling of output
|
|
||||||
* @return {String} output for results
|
|
||||||
*/
|
|
||||||
formatResults: function(results, filename, options) {
|
|
||||||
var messages = results.messages,
|
|
||||||
output = "";
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
if (messages.length === 0) {
|
|
||||||
return options.quiet ? "" : "\n\ncsslint: No errors in " + filename + ".";
|
|
||||||
}
|
|
||||||
|
|
||||||
output = "\n\ncsslint: There are " + messages.length + " problems in " + filename + ".";
|
|
||||||
var pos = filename.lastIndexOf("/"),
|
|
||||||
shortFilename = filename;
|
|
||||||
|
|
||||||
if (pos === -1){
|
|
||||||
pos = filename.lastIndexOf("\\");
|
|
||||||
}
|
|
||||||
if (pos > -1){
|
|
||||||
shortFilename = filename.substring(pos+1);
|
|
||||||
}
|
|
||||||
|
|
||||||
CSSLint.Util.forEach(messages, function (message, i) {
|
|
||||||
output = output + "\n\n" + shortFilename;
|
|
||||||
if (message.rollup) {
|
|
||||||
output += "\n" + (i+1) + ": " + message.type;
|
|
||||||
output += "\n" + message.message;
|
|
||||||
} else {
|
|
||||||
output += "\n" + (i+1) + ": " + message.type + " at line " + message.line + ", col " + message.col;
|
|
||||||
output += "\n" + message.message;
|
|
||||||
output += "\n" + message.evidence;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
exports.CSSLint = CSSLint;
|
exports.CSSLint = CSSLint;
|
||||||
|
|
|
||||||
|
|
@ -32,25 +32,60 @@ define(function(require, exports, module) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var oop = require("../lib/oop");
|
var oop = require("../lib/oop");
|
||||||
|
var lang = require("../lib/lang");
|
||||||
var Mirror = require("../worker/mirror").Mirror;
|
var Mirror = require("../worker/mirror").Mirror;
|
||||||
var CSSLint = require("./css/csslint").CSSLint;
|
var CSSLint = require("./css/csslint").CSSLint;
|
||||||
|
|
||||||
var Worker = exports.Worker = function(sender) {
|
var Worker = exports.Worker = function(sender) {
|
||||||
Mirror.call(this, sender);
|
Mirror.call(this, sender);
|
||||||
this.setTimeout(200);
|
this.setTimeout(400);
|
||||||
|
this.ruleset = null;
|
||||||
|
this.setDisabledRules("ids");
|
||||||
|
this.setInfoRules("adjoining-classes|qualified-headings|zero-units|gradients|import|outline-none");
|
||||||
};
|
};
|
||||||
|
|
||||||
oop.inherits(Worker, Mirror);
|
oop.inherits(Worker, Mirror);
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
this.setInfoRules = function(ruleNames) {
|
||||||
|
if (typeof ruleNames == "string")
|
||||||
|
ruleNames = ruleNames.split("|");
|
||||||
|
this.infoRules = lang.arrayToMap(ruleNames);
|
||||||
|
this.doc.getValue() && this.deferredUpdate.schedule(100);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.setDisabledRules = function(ruleNames) {
|
||||||
|
if (!ruleNames) {
|
||||||
|
this.ruleset = null;
|
||||||
|
} else {
|
||||||
|
if (typeof ruleNames == "string")
|
||||||
|
ruleNames = ruleNames.split("|");
|
||||||
|
var all = {};
|
||||||
|
|
||||||
|
CSSLint.getRules().forEach(function(x){
|
||||||
|
all[x.id] = true;
|
||||||
|
});
|
||||||
|
ruleNames.forEach(function(x) {
|
||||||
|
delete all[x];
|
||||||
|
});
|
||||||
|
console.log(all)
|
||||||
|
this.ruleset = all;
|
||||||
|
}
|
||||||
|
this.doc.getValue() && this.deferredUpdate.schedule(100);
|
||||||
|
};
|
||||||
|
|
||||||
this.onUpdate = function() {
|
this.onUpdate = function() {
|
||||||
var value = this.doc.getValue();
|
var value = this.doc.getValue();
|
||||||
|
var infoRules = this.infoRules;
|
||||||
|
|
||||||
var result = CSSLint.verify(value);
|
var result = CSSLint.verify(value, this.ruleset);
|
||||||
this.sender.emit("csslint", result.messages.map(function(msg) {
|
this.sender.emit("csslint", result.messages.map(function(msg) {
|
||||||
delete msg.rule;
|
return {
|
||||||
return msg;
|
row: msg.line - 1,
|
||||||
|
column: msg.col - 1,
|
||||||
|
text: msg.message,
|
||||||
|
type: infoRules[msg.rule.id] ? "info" : msg.type
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue