/** * @fileoverview Enforces or disallows a space beginning a single-line comment. * @author Greg Cochard * @copyright 2014 Greg Cochard. All rights reserved. */ "use strict"; //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ module.exports = function(context) { // Unless the first option is never, require a space var requireSpace = context.options[0] !== "never"; // Default to match anything, so all will fail if there are no exceptions var exceptionMatcher = new RegExp(" "); // Grab the exceptions array and build a RegExp matcher for it var hasExceptions = context.options.length === 2; var unescapedExceptions = hasExceptions ? context.options[1].exceptions : []; var exceptions; if (unescapedExceptions.length) { exceptions = unescapedExceptions.map(function(s) { return s.replace(/([.*+?${}()|\^\[\]\/\\])/g, "\\$1"); }); exceptionMatcher = new RegExp("(^(" + exceptions.join(")+$)|(^(") + ")+$)"); } //-------------------------------------------------------------------------- // Public //-------------------------------------------------------------------------- return { "LineComment": function checkCommentForSpace(node) { if (requireSpace) { // If length is zero, ignore it if (node.value.length === 0) { return; } // Space expected and not found if (node.value.indexOf(" ") !== 0 && node.value.indexOf("\t") !== 0) { /* * Do two tests; one for space starting the line, * and one for a comment comprised only of exceptions */ if (hasExceptions && !exceptionMatcher.test(node.value)) { context.report(node, "Expected exception block, space or tab after // in comment."); } else if (!hasExceptions) { context.report(node, "Expected space or tab after // in comment."); } } } else { if (node.value.indexOf(" ") === 0 || node.value.indexOf("\t") === 0) { context.report(node, "Unexpected space or tab after // in comment."); } } } }; }; module.exports.schema = [ { "enum": ["always", "never"] }, { "type": "object", "properties": { "exceptions": { "type": "array", "items": { "type": "string" } } }, "additionalProperties": false } ];