1<?php
2/**
3 * Squiz_Sniffs_Debug_JavaScriptLintSniff.
4 *
5 * PHP version 5
6 *
7 * @category  PHP
8 * @package   PHP_CodeSniffer
9 * @author    Greg Sherwood <gsherwood@squiz.net>
10 * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
11 * @license   https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
12 * @link      http://pear.php.net/package/PHP_CodeSniffer
13 */
14
15/**
16 * Squiz_Sniffs_Debug_JavaScriptLintSniff.
17 *
18 * Runs JavaScript Lint on the file.
19 *
20 * @category  PHP
21 * @package   PHP_CodeSniffer
22 * @author    Greg Sherwood <gsherwood@squiz.net>
23 * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
24 * @license   https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
25 * @version   Release: @package_version@
26 * @link      http://pear.php.net/package/PHP_CodeSniffer
27 */
28class Squiz_Sniffs_Debug_JavaScriptLintSniff implements PHP_CodeSniffer_Sniff
29{
30
31    /**
32     * A list of tokenizers this sniff supports.
33     *
34     * @var array
35     */
36    public $supportedTokenizers = array('JS');
37
38
39    /**
40     * Returns the token types that this sniff is interested in.
41     *
42     * @return int[]
43     */
44    public function register()
45    {
46        return array(T_OPEN_TAG);
47
48    }//end register()
49
50
51    /**
52     * Processes the tokens that this sniff is interested in.
53     *
54     * @param PHP_CodeSniffer_File $phpcsFile The file where the token was found.
55     * @param int                  $stackPtr  The position in the stack where
56     *                                        the token was found.
57     *
58     * @return void
59     */
60    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
61    {
62        $fileName = $phpcsFile->getFilename();
63
64        $jslPath = PHP_CodeSniffer::getConfigData('jsl_path');
65        if (is_null($jslPath) === true) {
66            return;
67        }
68
69        $cmd = '"'.escapeshellcmd($jslPath).'" -nologo -nofilelisting -nocontext -nosummary -output-format __LINE__:__ERROR__ -process '.escapeshellarg($fileName);
70        $msg = exec($cmd, $output, $retval);
71
72        // Variable $exitCode is the last line of $output if no error occurs, on
73        // error it is numeric. Try to handle various error conditions and
74        // provide useful error reporting.
75        if ($retval === 2 || $retval === 4) {
76            if (is_array($output) === true) {
77                $msg = join('\n', $output);
78            }
79
80            throw new PHP_CodeSniffer_Exception("Failed invoking JavaScript Lint, retval was [$retval], output was [$msg]");
81        }
82
83        if (is_array($output) === true) {
84            foreach ($output as $finding) {
85                $split   = strpos($finding, ':');
86                $line    = substr($finding, 0, $split);
87                $message = substr($finding, ($split + 1));
88                $phpcsFile->addWarningOnLine(trim($message), $line, 'ExternalTool');
89            }
90        }
91
92        // Ignore the rest of the file.
93        return ($phpcsFile->numTokens + 1);
94
95    }//end process()
96
97
98}//end class
99