text: "use strict";
  
  exports.register = function(linter) {
    // Check for properties named __proto__. This special property was
    // deprecated and then re-introduced for ES6.
  
    linter.on("Identifier", function style_scanProto(data) {
      if (linter.getOption("proto")) {
        return;
      }
  
      if (data.name === "__proto__") {
        linter.warn("W103", {
          line: data.line,
          char: data.char,
          data: [ data.name, "6" ]
        });
      }
    });
  
    // Check for properties named __iterator__. This is a special property
    // available only in browsers with JavaScript 1.7 implementation, but
    // it is deprecated for ES6
  
    linter.on("Identifier", function style_scanIterator(data) {
      if (linter.getOption("iterator")) {
        return;
      }
  
      if (data.name === "__iterator__") {
        linter.warn("W103", {
          line: data.line,
          char: data.char,
          data: [ data.name ]
        });
      }
    });
  
    // Check that all identifiers are using camelCase notation.
    // Exceptions: names like MY_VAR and _myVar.
  
    linter.on("Identifier", function style_scanCamelCase(data) {
      if (!linter.getOption("camelcase")) {
        return;
      }
  
      if (data.name.replace(/^_+|_+$/g, "").indexOf("_") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) {
        linter.warn("W106", {
          line: data.line,
          char: data.from,
          data: [ data.name ]
        });
      }
    });
  
    // Enforce consistency in style of quoting.
  
    linter.on("String", function style_scanQuotes(data) {
      var quotmark = linter.getOption("quotmark");
      var code;
  
      if (!quotmark) {
        return;
      }
  
      // If quotmark is set to 'single' warn about all double-quotes.
  
      if (quotmark === "single" && data.quote !== "'") {
        code = "W109";
      }
  
      // If quotmark is set to 'double' warn about all single-quotes.
  
      if (quotmark === "double" && data.quote !== "\"") {
        code = "W108";
      }
  
      // If quotmark is set to true, remember the first quotation style
      // and then warn about all others.
  
      if (quotmark === true) {
        if (!linter.getCache("quotmark")) {
          linter.setCache("quotmark", data.quote);
        }
  
        if (linter.getCache("quotmark") !== data.quote) {
          code = "W110";
        }
      }
  
      if (code) {
        linter.warn(code, {
          line: data.line,
          char: data.char,
        });
      }
    });
  
    linter.on("Number", function style_scanNumbers(data) {
      if (data.value.charAt(0) === ".") {
        // Warn about a leading decimal point.
        linter.warn("W008", {
          line: data.line,
          char: data.char,
          data: [ data.value ]
        });
      }
  
      if (data.value.substr(data.value.length - 1) === ".") {
        // Warn about a trailing decimal point.
        linter.warn("W047", {
          line: data.line,
          char: data.char,
          data: [ data.value ]
        });
      }
  
      if (/^00+/.test(data.value)) {
        // Multiple leading zeroes.
        linter.warn("W046", {
          line: data.line,
          char: data.char,
          data: [ data.value ]
        });
      }
    });
  
    // Warn about script URLs.
  
    linter.on("String", function style_scanJavaScriptURLs(data) {
      var re = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i;
  
      if (linter.getOption("scripturl")) {
        return;
      }
  
      if (re.test(data.value)) {
        linter.warn("W107", {
          line: data.line,
          char: data.char
        });
      }
    });
  };
  