Skip to content

Commit e2a55bb

Browse files
author
Nicholas C. Zakas
committed
Merge branch 'master' of github.com:stubbornella/csslint
2 parents 30ec963 + 4e6c8e7 commit e2a55bb

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

src/formatters/checkstyle-xml.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,38 @@ CSSLint.addFormatter({
2323
* @return rule source as {String}
2424
*/
2525
var generateSource = function(rule) {
26+
if (!rule || !('name' in rule)) {
27+
return "";
28+
}
2629
return 'net.csslint.' + rule.name.replace(/\s/g,'');
2730
};
2831

32+
/**
33+
* Replace special characters before write to output.
34+
*
35+
* Rules:
36+
* - single quotes is the escape sequence for double-quotes
37+
* - &lt; is the escape sequence for <
38+
* - &gt; is the escape sequence for >
39+
*
40+
* @param {String} message to escape
41+
* @return escaped message as {String}
42+
*/
43+
var escapeSpecialCharacters = function(str) {
44+
if (!str || str.constructor !== String) {
45+
return "";
46+
}
47+
return str.replace(/\"/g, "'").replace(/</g, "&lt;").replace(/>/g, "&gt;");
48+
};
49+
2950
if (messages.length > 0) {
3051
output.push("<file name=\""+filename+"\">");
3152
messages.forEach(function (message, i) {
3253
if (message.rollup) {
3354
//ignore rollups for now
3455
} else {
3556
output.push("<error line=\"" + message.line + "\" column=\"" + message.col + "\" severity=\"" + message.type + "\"" +
36-
" message=\"" + message.message + "\" source=\"" + generateSource(message.rule) +"\"/>");
57+
" message=\"" + escapeSpecialCharacters(message.message) + "\" source=\"" + generateSource(message.rule) +"\"/>");
3758
}
3859
});
3960
output.push("</file>");

tests/formatters/checkstyle-xml.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,20 @@
2525
actual = CSSLint.format(result, "FILE", "checkstyle-xml");
2626
Assert.areEqual(expected, actual);
2727
},
28+
29+
"Formatter should escape special characters": function() {
30+
var specialCharsSting = 'sneaky, "sneaky", <sneaky>',
31+
result = { messages: [
32+
{ type: "warning", line: 1, col: 1, message: specialCharsSting, evidence: "ALSO BOGUS", rule: [] },
33+
{ type: "error", line: 2, col: 1, message: specialCharsSting, evidence: "ALSO BOGUS", rule: [] }
34+
], stats: [] },
35+
file = "<file name=\"FILE\">",
36+
error1 = "<error line=\"1\" column=\"1\" severity=\"warning\" message=\"sneaky, 'sneaky', &lt;sneaky&gt;\" source=\"\"/>",
37+
error2 = "<error line=\"2\" column=\"1\" severity=\"error\" message=\"sneaky, 'sneaky', &lt;sneaky&gt;\" source=\"\"/>",
38+
expected = "<?xml version=\"1.0\" encoding=\"utf-8\"?><checkstyle>" + file + error1 + error2 + "</file></checkstyle>",
39+
actual = CSSLint.format(result, "FILE", "checkstyle-xml");
40+
Assert.areEqual(expected, actual);
41+
}
42+
2843
}));
2944
})();

0 commit comments

Comments
 (0)