All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.edgarespina.mwa.wro4j.LintOptions Maven / Gradle / Ivy

package com.github.edgarespina.mwa.wro4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;

/**
 * Configure JSHint/JSLint/CSSLint options.
 *
 * @author edgar.espina
 * @since 0.1
 */
public final class LintOptions {

  /**
   * Default number of errors.
   */
  private static final int MAX_ERRORS = 50;

  /**
   * Max number of chars per line.
   */
  private static final int MAX_LEN = 80;

  /**
   * The option list.
   */
  private final Map options = new HashMap();

  /**
   * Predefined/global variables.
   */
  private final List predefined = new ArrayList();

  /**
   * Use one of the static method.
   */
  private LintOptions() {
  }

  /**
   * Creates a defaults JS Hint/Lint options. After creation you can safely add
   * new options.
   *
   * @return A new options.
   */
  public static LintOptions jsDefaults() {
    return new LintOptions()
        .option("maxerr", MAX_ERRORS)
        .option("browser")
        .option("jquery")
        .option("devel")
        .option("globalstrict", false)
        .option("strict", false)
        .option("forin")
        .option("noarg")
        .option("noempty")
        .option("eqeqeq")
        .option("bitwise")
        .option("undef")
        .option("curly")
        .option("indent", 2)
        .option("maxlen", MAX_LEN);
  }

  /**
   * 

* Available rules: *

*
    *
  • import: Don't use @import, use <link> instead. *
  • adjoining-classes: Don't use adjoining classes. *
  • important: Be careful when using !important declaration. *
  • box-sizing: The box-sizing properties isn't supported in IE6 and IE7. *
  • box-model: Don't use width or height when using padding or border. *
  • known-properties: Properties should be known (listed in CSS * specification) or be a vendor-prefixed property. *
  • duplicate-background-images: Every background-image should be unique. * Use a common class for e.g. sprites. *
  • compatible-vendor-prefixes: Include all compatible vendor prefixes to * reach a wider range of users. *
  • display-property-grouping: Certain properties shouldn't be used with * certain display property values. *
  • overqualified-elements: Don't use classes or IDs with elements (a.foo * or a#foo). *
  • fallback-colors: For older browsers that don't support RGBA, HSL, or * HSLA, provide a fallback color. *
  • duplicate-properties: Duplicate properties must appear one after the * other. *
  • empty-rules: Rules without any properties specified should be removed. *
  • errors: This rule looks for recoverable syntax errors. *
  • rules-count: Track how many rules there are. *
  • ids: Selectors should not contain IDs. *
  • font-sizes: Checks the number of font-size declarations. *
  • font-faces: Too many different web fonts in the same stylesheet. *
  • gradients: When using a vendor-prefixed gradient, make sure to use them * all. *
  • floats: This rule tests if the float property is used too many times *
  • outline-none: Use of outline: none or outline: 0 should be limited to * :focus rules. *
  • qualified-headings: Headings should not be qualified (namespaced). *
  • regex-selectors: Selectors that look like regular expressions are slow * and should be avoided. *
  • shorthand: Use shorthand properties where possible. *
  • text-indent: Checks for text indent less than -99px. *
  • unique-headings: Headings should be defined only once. *
  • universal-selector: The universal selector (*) is known to be slow. *
  • unqualified-attributes: Unqualified attribute selectors are known to be * slow. *
  • vendor-prefix: When using a vendor-prefixed property, make sure to * include the standard one. *
  • zero-units: You don't need to specify units when a value is 0. *
* * @return A new options. */ public static LintOptions cssDefaults() { return new LintOptions() .option("important") .option("box-sizing") .option("box-model") .option("known-properties") .option("duplicate-background-images") .option("compatible-vendor-prefixes") .option("display-property-grouping") .option("overqualified-elements") .option("fallback-colors") .option("duplicate-properties") .option("empty-rules") .option("errors") .option("ids") .option("font-sizes") .option("font-faces") .option("gradients") .option("floats") .option("outline-none") .option("qualified-headings") .option("regex-selectors") .option("shorthand") .option("text-indent") .option("unique-headings") .option("universal-selector") .option("unqualified-attributes") .option("vendor-prefix") .option("zero-units"); } /** * Creates a new {@link LintOptions}. After creation you can safely add * new options. * * @param names A list of option's names. * @return A new {@link LintOptions}. */ public static LintOptions options(final String... names) { return new LintOptions().option(names); } /** * Enable all the given options. * * @param names The option's name. Required. * @return This options. */ public LintOptions option(final String... names) { Validate.notEmpty(names, "The option's name is required."); for (String name : names) { options.put(name, true); } return this; } /** * Enable or disable the given option. * * @param name The option's name. Required. * @param value The option's value. Required. * @return This options. */ public LintOptions option(final String name, final boolean value) { Validate.notEmpty(name, "The option's name is required."); options.put(name, value); return this; } /** * Enable the given option. * * @param name The option's name. Required. * @param value The option's value. Required. * @return This options. */ public LintOptions option(final String name, final int value) { Validate.notEmpty(name, "The option's name is required."); options.put(name, value); return this; } /** * Enable the given option. * * @param name The option's name. Required. * @param value The option's value. Required. * @return This options. */ public LintOptions option(final String name, final String value) { Validate.notEmpty(name, "The option's name is required."); Validate.notEmpty(value, "The option's value is required."); options.put(name, value); return this; } /** * Append a new global/predefined variable. * * @param names The variable's name, like: jquery, $, etc.. Required. * @return This options. */ public LintOptions predefined(final String... names) { Validate.notEmpty(names, "The global variable's name is required."); for (String name : names) { predefined.add("'" + name + "'"); } return this; } /** * Publish all the options as String array. * * @return The string array required by JS Lint/Hint. */ /* package */String[] build() { List options = new ArrayList(this.options.size()); for (Entry option : this.options.entrySet()) { if (Boolean.valueOf(option.getValue().toString()) == Boolean.TRUE) { options.add(option.getKey()); } else { options.add(option.getKey() + "=" + option.getValue()); } } if (predefined.size() > 0) { options.add( "predef=[" + StringUtils.join(predefined, ",") + "]"); } return options.toArray(new String[options.size()]); } @Override public String toString() { return StringUtils.join(build(), ";"); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy