mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.5 KiB
84 lines
2.5 KiB
10 years ago
|
/**
|
||
|
* @fileoverview A rule to choose between single and double quote marks
|
||
|
* @author Matt DuVall <http://www.mattduvall.com/>, Brandon Payton
|
||
|
*/
|
||
|
|
||
|
"use strict";
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
// Constants
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
var QUOTE_SETTINGS = {
|
||
|
"double": {
|
||
|
quote: "\"",
|
||
|
alternateQuote: "'",
|
||
|
description: "doublequote"
|
||
|
},
|
||
|
"single": {
|
||
|
quote: "'",
|
||
|
alternateQuote: "\"",
|
||
|
description: "singlequote"
|
||
|
},
|
||
|
"backtick": {
|
||
|
quote: "`",
|
||
|
alternateQuote: "\"",
|
||
|
description: "backtick"
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var AVOID_ESCAPE = "avoid-escape";
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
// Rule Definition
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
module.exports = function(context) {
|
||
|
|
||
|
/**
|
||
|
* Validate that a string passed in is surrounded by the specified character
|
||
|
* @param {string} val The text to check.
|
||
|
* @param {string} character The character to see if it's surrounded by.
|
||
|
* @returns {boolean} True if the text is surrounded by the character, false if not.
|
||
|
* @private
|
||
|
*/
|
||
|
function isSurroundedBy(val, character) {
|
||
|
return val[0] === character && val[val.length - 1] === character;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Determines if a given node is part of JSX syntax.
|
||
|
* @param {ASTNode} node The node to check.
|
||
|
* @returns {boolean} True if the node is a JSX node, false if not.
|
||
|
* @private
|
||
|
*/
|
||
|
function isJSXElement(node) {
|
||
|
return node.type.indexOf("JSX") === 0;
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
|
||
|
"Literal": function(node) {
|
||
|
var val = node.value,
|
||
|
rawVal = node.raw,
|
||
|
quoteOption = context.options[0],
|
||
|
settings = QUOTE_SETTINGS[quoteOption],
|
||
|
avoidEscape = context.options[1] === AVOID_ESCAPE,
|
||
|
isValid;
|
||
|
|
||
|
if (settings && typeof val === "string") {
|
||
|
isValid = isJSXElement(node.parent) || isSurroundedBy(rawVal, settings.quote);
|
||
|
|
||
|
if (!isValid && avoidEscape) {
|
||
|
isValid = isSurroundedBy(rawVal, settings.alternateQuote) && rawVal.indexOf(settings.quote) >= 0;
|
||
|
}
|
||
|
|
||
|
if (!isValid) {
|
||
|
context.report(node, "Strings must use " + settings.description + ".");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
};
|