UNPKG

gulp-hint-web-reporter

Version:

Hint web reporter compatible with htmlhint, jshint, csslint and maybe others

126 lines (104 loc) 3.64 kB
"use strict"; var acid = 0, loadTemplates = require('./templates-loader'); function spaces(length) { var result = ""; while (length > 1) { result += "&nbsp;"; length -= 1; } return result; } function escapeHtml(text) { if (typeof text !== 'string') { return text; } return text .replace(/&/g, "&amp;") .replace(/</g, "&lt;") .replace(/>/g, "&gt;") .replace(/"/g, "&quot;") .replace(/'/g, "&#039;"); } 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)); }