SimenB/stylint

View on GitHub
docs/checks_sortOrder.js.html

Summary

Maintainability
Test Coverage
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JSDoc: Source: checks/sortOrder.js</title>

    <script src="scripts/prettify/prettify.js"> </script>
    <script src="scripts/prettify/lang-css.js"> </script>
    <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
    <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>

<body>

<div id="main">

    <h1 class="page-title">Source: checks/sortOrder.js</h1>

    



    
    <section>
        <article>
            <pre class="prettyprint source linenums"><code>'use strict'

var resetOnFileChange = 0
var ignoreMeRe = /[.#${}=>&amp;*]|\(.*\)|(&amp;:)|(if)|(for)|(@block)|(@import)|(@media)|(@extends)|,$/
var ordering = require( '../data/ordering.json' )


/**
 * @description check that selector properties are sorted accordingly
 * @param  {string} [line] curr line being linted
 * @return {boolean} true if in order, false if not
 */
var sortOrder = function( line ) {
    // we don't alphabetize the root yet
    if ( this.state.context === 0 || this.state.hash ) {
        this.cache.sortOrderCache = []
        return
    }

    /*
     * 1 we strip out mixins, and whitespace, and get the line as an array
     * 2 we need a sorted array to compare our cache against
     * 3 equals the custom sorting array via the config (or the ordering json)
     * 4 assume sorted by default
     * 5 alphabetical by default, if custom array we output a shorter msg
     */
    var arr = this.splitAndStrip(
        new RegExp( /[\s\t,:]/ ), line.replace( /(\(.+\))/, '' )
    ) // 1
    var sortedArr = [] // 2
    var orderingArr = [] // 3
    var sorted = true // 4
    var orderName = this.state.conf // 5

    if ( ignoreMeRe.test( arr[0] ) ) return

    if ( Array.isArray( this.state.conf ) ) {
        orderName = 'custom grouped'
    }

    // if current context switched, reset array
    if ( this.state.context !== this.state.prevContext ) {
        this.cache.sortOrderCache = []
    }

    // reset on file change
    if ( this.cache.file !== resetOnFileChange ) {
        this.cache.sortOrderCache = []
        resetOnFileChange = this.cache.file
    }

    // then we push the latest property to the cache
    this.cache.sortOrderCache.push( arr[0] )

    // create a copy of the cache now for comparison against
    sortedArr = this.cache.sortOrderCache.slice( 0 )

    // and then sort it (by default alphabetically)
    if ( this.state.conf === 'alphabetical' ) {
        sortedArr = sortedArr.sort()
    }
    // if not default, we can either use the grouped option
    // or a custom sorting order, specificed by a config file
    else if ( this.state.conf === 'grouped' || Array.isArray( this.state.conf ) ) {
        // use custom ordering if specified, or fall back to in-built grouped ordering
        orderingArr = Array.isArray( this.state.conf ) ? this.state.conf : ordering.grouped

        // iterate over our cache copy, and sort it according to our config
        sortedArr = sortedArr.sort( function( a, b ) {
            var aIndex = orderingArr.indexOf( a )
            var bIndex = orderingArr.indexOf( b )

            // allow properties that don't exist in ordering array to be last
            if ( bIndex &lt; 0 ) {
                bIndex = orderingArr.length
            }

            // -1 if our 'sorted (not yet sorted)' array is not in the right order
            if ( aIndex &lt; bIndex ) {
                return -1
            }
            // and 1 if it is
            else if ( bIndex &lt; aIndex ) {
                return 1
            }
        } )
    }

    // now compare our two arrays
    // one sorted according to the config, and one as appears in the file
    if ( this.state.context === this.state.prevContext ) {
        // compare each value individually
        this.cache.sortOrderCache.forEach( function( val, i ) {
            // if any value doesn't match quit the forEach
            if ( sortedArr[i] !== this.cache.sortOrderCache[i] ) {
                sorted = false
                return
            }
        }.bind( this ) )
    }

    if ( sorted === false ) {
        this.msg( 'prefer ' + orderName + ' when sorting properties' )
    }

    return sorted
}

module.exports = sortOrder
</code></pre>
        </article>
    </section>




</div>

<nav>
    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#blocks">blocks</a></li><li><a href="global.html#brackets">brackets</a></li><li><a href="global.html#checkPrefix">checkPrefix</a></li><li><a href="global.html#checkPseudo">checkPseudo</a></li><li><a href="global.html#colons">colons</a></li><li><a href="global.html#colors">colors</a></li><li><a href="global.html#commaSpace">commaSpace</a></li><li><a href="global.html#commentSpace">commentSpace</a></li><li><a href="global.html#config">config</a></li><li><a href="global.html#cssLiteral">cssLiteral</a></li><li><a href="global.html#depthLimit">depthLimit</a></li><li><a href="global.html#done">done</a></li><li><a href="global.html#duplicates">duplicates</a></li><li><a href="global.html#efficient">efficient</a></li><li><a href="global.html#extendPref">extendPref</a></li><li><a href="global.html#getFiles">getFiles</a></li><li><a href="global.html#hashEnd">hashEnd</a></li><li><a href="global.html#hashStart">hashStart</a></li><li><a href="global.html#indentPref">indentPref</a></li><li><a href="global.html#init">init</a></li><li><a href="global.html#keyframesEnd">keyframesEnd</a></li><li><a href="global.html#keyframesStart">keyframesStart</a></li><li><a href="global.html#leadingZero">leadingZero</a></li><li><a href="global.html#lint">lint</a></li><li><a href="global.html#mixed">mixed</a></li><li><a href="global.html#msg">msg</a></li><li><a href="global.html#namingConvention">namingConvention</a></li><li><a href="global.html#noImportant">noImportant</a></li><li><a href="global.html#none">none</a></li><li><a href="global.html#parenSpace">parenSpace</a></li><li><a href="global.html#parse">parse</a></li><li><a href="global.html#placeholders">placeholders</a></li><li><a href="global.html#prefixVarsWithDollar">prefixVarsWithDollar</a></li><li><a href="global.html#quotePref">quotePref</a></li><li><a href="global.html#read">read</a></li><li><a href="global.html#reporter">reporter</a></li><li><a href="global.html#resetOnChange">resetOnChange</a></li><li><a href="global.html#rootEnd">rootEnd</a></li><li><a href="global.html#rootStart">rootStart</a></li><li><a href="global.html#semicolons">semicolons</a></li><li><a href="global.html#setConfig">setConfig</a></li><li><a href="global.html#setContext">setContext</a></li><li><a href="global.html#setState">setState</a></li><li><a href="global.html#sortOrder">sortOrder</a></li><li><a href="global.html#splitAndStrip">splitAndStrip</a></li><li><a href="global.html#stackedProperties">stackedProperties</a></li><li><a href="global.html#startsWithComment">startsWithComment</a></li><li><a href="global.html#state">state</a></li><li><a href="global.html#stylintOff">stylintOff</a></li><li><a href="global.html#stylintOn">stylintOn</a></li><li><a href="global.html#trailingWhitespace">trailingWhitespace</a></li><li><a href="global.html#trimLine">trimLine</a></li><li><a href="global.html#universal">universal</a></li><li><a href="global.html#watch">watch</a></li><li><a href="global.html#zeroUnits">zeroUnits</a></li><li><a href="global.html#zIndexNormalize">zIndexNormalize</a></li></ul>
</nav>

<br class="clear">

<footer>
    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.2</a> on Sun Oct 09 2016 22:18:45 GMT+0200 (CEST)
</footer>

<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>