gulp-hint-web-reporter
Version:
Hint web reporter compatible with htmlhint, jshint, csslint and maybe others
126 lines (104 loc) • 3.64 kB
JavaScript
var acid = 0,
loadTemplates = require('./templates-loader');
function spaces(length) {
var result = "";
while (length > 1) {
result += " ";
length -= 1;
}
return result;
}
function escapeHtml(text) {
if (typeof text !== 'string') {
return text;
}
return text
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
function isError(errorCode) {
return errorCode && errorCode.toUpperCase()[0] === 'E';
}
function calculateNumberOfFailures(results) {
var numberOfFailures = {
failures: 0,
errors: 0,
warnings: 0
};
results.forEach(function(element) {
numberOfFailures.failures += 1;
if (isError(element.error.type)) {
numberOfFailures.errors += 1;
} else {
numberOfFailures.warnings += 1;
}
});
return numberOfFailures;
}
function prepareContent(results, templates) {
var bodyContent = '',
items = '',
previousFile = '',
content = '';
if (results.length === 0) {
return templates.noItems;
}
results.forEach(function(element) {
var errType, errLine, errCol, errEvidence, errReason, errRule, errLink,
file = element.file,
error = element.error;
if (previousFile !== file) {
if (content.length && items.length) {
bodyContent += content.replace('{items}', items);
}
previousFile = file;
acid += 1;
content = templates.content
.replace(/\{acid\}/g, acid)
.replace('{file}', file);
items = '';
}
errType = error.type || error.code || "error";
errLine = error.line || 0;
errCol = error.col || error.character || 0;
errEvidence = error.evidence || "";
if (errCol > 30) {
errEvidence = escapeHtml(errEvidence.substr(errCol - 30, 40));
errEvidence += "<br/>" + spaces(30) + "^";
} else {
errEvidence = escapeHtml(errEvidence) + "<br/>" + spaces(errCol) + "^";
}
errReason = error.reason || (error.rule && error.rule.description) || "";
errRule = (error.rule && error.rule.id) || "";
errLink = (error.rule && error.rule.link) || "#";
items += templates.item
.replace('{class}', isError(errType) ? 'danger' : 'warning')
.replace('{code}', errType)
.replace('{line}', escapeHtml(errLine))
.replace('{col}', escapeHtml(errCol))
.replace('{evidence}', errEvidence)
.replace('{reason}', escapeHtml(errReason))
.replace('{rule}', escapeHtml(errRule))
.replace('{link}', errLink);
});
bodyContent += content.replace('{items}', items);
return bodyContent;
}
function prepareSummary(results, templates) {
var numberOfFailures = calculateNumberOfFailures(results),
summary = templates.summary
.replace('{failures}', numberOfFailures.failures)
.replace('{errors}', numberOfFailures.errors)
.replace('{warnings}', numberOfFailures.warnings);
return numberOfFailures.failures ? summary : "";
}
module.exports = function getRenderedHTML(results, templates) {
var templates = loadTemplates();
return templates.body
.replace('{content}', prepareContent(results, templates))
.replace('{summary}', prepareSummary(results, templates));
}
;