Blame view
node_modules/eslint/lib/rules/no-trailing-spaces.js
3.51 KB
c39994410
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
/** * @fileoverview Disallow trailing spaces at the end of lines. * @author Nodeca Team <https://github.com/nodeca> * @copyright 2015 Greg Cochard */ "use strict"; //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ module.exports = function(context) { var BLANK_CLASS = "[ \t\u00a0\u2000-\u200b\u2028\u2029\u3000]", SKIP_BLANK = "^" + BLANK_CLASS + "*$", NONBLANK = BLANK_CLASS + "+$"; var options = context.options[0] || {}, skipBlankLines = options.skipBlankLines || false; /** * Report the error message * @param {ASTNode} node node to report * @param {int[]} location range information * @param {int[]} fixRange Range based on the whole program * @returns {void} */ function report(node, location, fixRange) { // Passing node is a bit dirty, because message data will contain // big text in `source`. But... who cares :) ? // One more kludge will not make worse the bloody wizardry of this plugin. context.report({ node: node, loc: location, message: "Trailing spaces not allowed.", fix: function(fixer) { return fixer.removeRange(fixRange); } }); } //-------------------------------------------------------------------------- // Public //-------------------------------------------------------------------------- return { "Program": function checkTrailingSpaces(node) { // Let's hack. Since Espree does not return whitespace nodes, // fetch the source code and do matching via regexps. var src = context.getSource(), re = new RegExp(NONBLANK), skipMatch = new RegExp(SKIP_BLANK), matches, lines = src.split(/\r? /), linebreaks = context.getSource().match(/\r |\r| |\u2028|\u2029/g), location, totalLength = 0, fixRange = []; for (var i = 0, ii = lines.length; i < ii; i++) { matches = re.exec(lines[i]); // Always add linebreak length to line length to accommodate for line break ( or \r ) // Because during the fix time they also reserve one spot in the array. // Usually linebreak length is 2 for \r (CRLF) and 1 for (LF) var linebreakLength = linebreaks && linebreaks[i] ? linebreaks[i].length : 1; var lineLength = lines[i].length + linebreakLength; if (matches) { // If the line has only whitespace, and skipBlankLines // is true, don't report it if (skipBlankLines && skipMatch.test(lines[i])) { continue; } location = { line: i + 1, column: matches.index }; fixRange = [totalLength + location.column, totalLength + lineLength - linebreakLength]; report(node, location, fixRange); } totalLength += lineLength; } } }; }; module.exports.schema = [ { "type": "object", "properties": { "skipBlankLines": { "type": "boolean" } }, "additionalProperties": false } ]; |