Mercurial > defr > drupal > core
comparison scripts/code-style.pl @ 1:c1f4ac30525a 6.0
Drupal 6.0
| author | Franck Deroche <webmaster@defr.org> |
|---|---|
| date | Tue, 23 Dec 2008 14:28:28 +0100 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:5a113a1c4740 | 1:c1f4ac30525a |
|---|---|
| 1 #!/usr/bin/perl -w | |
| 2 # $Id: code-style.pl,v 1.14 2007/02/15 11:40:19 dries Exp $ | |
| 3 | |
| 4 use Pod::Usage; | |
| 5 use Getopt::Long qw(GetOptions); | |
| 6 Getopt::Long::Configure ("bundling"); | |
| 7 | |
| 8 my %opt = ( "help" => 0, | |
| 9 'debug' => 0, | |
| 10 ); | |
| 11 | |
| 12 if(!GetOptions(\%opt, | |
| 13 'help|?', | |
| 14 'debug', | |
| 15 )) { | |
| 16 pod2usage(-exitval => 1, 'verbose'=>0); | |
| 17 } | |
| 18 | |
| 19 pod2usage(-exitval => 0, -verbose => 2) if($opt{'help'}); | |
| 20 | |
| 21 $debug = $opt{'debug'}; | |
| 22 | |
| 23 $comment = 0; #flag used to signal we're inside /* */ | |
| 24 $program = 0; #flag used to signal we're inside <?php ?> | |
| 25 #read the file | |
| 26 while (<>) { | |
| 27 $org=$_; | |
| 28 s/\\["']//g; | |
| 29 # please don't use nested comments for now... thanks! | |
| 30 # handles comments // style, but don't mess with http:// | |
| 31 s/\/\/[^:].*//; | |
| 32 # handles comments /**/ on a single line | |
| 33 s/\/\*.*\*\///g; | |
| 34 # handles comments /**/ over several lines | |
| 35 if ($comment == 1) { | |
| 36 if (s/.*\*\///) { | |
| 37 $comment = 0; | |
| 38 } | |
| 39 else { | |
| 40 next; | |
| 41 } | |
| 42 } | |
| 43 if (s/\/\*.*//) { | |
| 44 $comment = 1; | |
| 45 } | |
| 46 if (/^\s*#/) { | |
| 47 next; | |
| 48 } | |
| 49 | |
| 50 if (s/<\?php//) { | |
| 51 $program = 1; | |
| 52 } | |
| 53 if (/\?>/) { | |
| 54 $program = 0; | |
| 55 } | |
| 56 | |
| 57 # enforce "bar". foo() ."bar" syntax | |
| 58 if (/^("[^"]*"|[^"])*("[^"]*")\.[^ ]/ && $program) { | |
| 59 $msg = "'\".' -> '\". '"; | |
| 60 } | |
| 61 elsif (/^("[^"]*"|[^"])*("[^"]*")\s+\./ && $program) { | |
| 62 $msg = "'\" .' -> '\".'"; | |
| 63 } | |
| 64 # enforce "bar". foo() ."bar" syntax | |
| 65 elsif (/^("[^"]*"|[^"])*[^ "]\.("[^"]*")/ && $program) { | |
| 66 $msg = "'.\"' -> '.\"'"; | |
| 67 } | |
| 68 elsif (/^("[^"]*"|[^"])*[^ "]\.\s+("[^"]*")/ && $program) { | |
| 69 $msg = "'. \"' -> '.\"'"; | |
| 70 } | |
| 71 # XHTML requires closing tag | |
| 72 elsif (/<br>/i) { | |
| 73 $msg = "'<br>' -> '<br />'"; | |
| 74 } | |
| 75 elsif (/\$REQUEST_URI/i) { | |
| 76 $msg = "the use of REQUEST_URI is prone to XSS exploits and does not work on IIS; use request_uri() instead"; | |
| 77 } | |
| 78 elsif (/\"REQUEST_URI\"/i) { | |
| 79 $msg = "the use of REQUEST_URI is prone to XSS exploits and does not work on IIS; use request_uri() instead"; | |
| 80 } | |
| 81 | |
| 82 # XHTML compatibility mode suggests a blank before / | |
| 83 # i.e. <br /> | |
| 84 elsif (/<[a-z][^>]*[^ >]\/>/i) { | |
| 85 $msg = "'<foo/".">' -> '<foo />'"; | |
| 86 } | |
| 87 # we write '{' on the same line, not on the next | |
| 88 elsif (/^\s*{/ && $program) { | |
| 89 $msg = "take '{' to previous line"; | |
| 90 } | |
| 91 elsif (/([a-z])([A-Z])/) { | |
| 92 $msg = "no mixed case function or variable names, use lower case and _"; | |
| 93 } | |
| 94 elsif (/<[\/]*[A-Z]+[^>]*>/) { | |
| 95 $msg = "XHTML demands tags to be lowercase"; | |
| 96 } | |
| 97 | |
| 98 # trying to recognize splitted lines | |
| 99 # there are only a few valid last characters in programming mode, | |
| 100 # only sometimes it is ( if you use if/else with a single statement | |
| 101 | |
| 102 # from here on we need no more strings | |
| 103 while (s/^([^"]*)"[^"]*"/$1#/) {}; | |
| 104 while (s/^([^']*)'[^']*'/$1#/) {}; | |
| 105 | |
| 106 # it should be 'if (' all the time | |
| 107 if (/(^|[^a-zA-Z])(if|else|elseif|while|foreach|switch|return|for)\(/) { | |
| 108 $msg = "'(' -> ' ('"; | |
| 109 } | |
| 110 #elsif (/[^;{}:\s\n]\s*\n*$/ && $program && !/^[\s}]*(if|else)/) { | |
| 111 # $msg = "don't split lines"; | |
| 112 #} | |
| 113 elsif (/\}\s*else/) { | |
| 114 $msg = "'} else' -> '}\\nelse'"; | |
| 115 } | |
| 116 elsif (/[^{\s\n]\s*\n*$/ && $program && /^\s*(if|else)/) { | |
| 117 $msg = "every if/else needs a { at eol"; | |
| 118 } | |
| 119 elsif (/([\(\[]) / && $program) { | |
| 120 $msg = "'$1 ' -> '$1'"; | |
| 121 } | |
| 122 elsif (/\S ([\)\]])/ && $program) { | |
| 123 $msg = "' $1' -> '$1'"; | |
| 124 } | |
| 125 # but no brackets | |
| 126 elsif (/([a-z-A-Z_][a-zA-Z0-9_-]*)\s+\(/ && $program) { | |
| 127 if ($1 ne "switch" and $1 ne "if" and $1 ne "while" and $1 ne "foreach" and $1 ne "return" and $1 ne "for" and $1 ne "elseif") { | |
| 128 $msg = "'$1 (' -> '$1('"; | |
| 129 } | |
| 130 } | |
| 131 # there should be a space before '{' | |
| 132 if (/[^ ]{/ && $program) { | |
| 133 $msg = "missing space before '{'"; | |
| 134 } | |
| 135 # there should be a space after ',' | |
| 136 elsif (/[,][^ \n\r]/ && $program) { | |
| 137 $msg = "missing space after ','"; | |
| 138 } | |
| 139 # spaces before and after, only foreach may use $foo=>bar | |
| 140 elsif (/[^ =|\-|\+](\+|\-)[^ =>|\-|\+]/ && $program && !/foreach/) { | |
| 141 $msg = "'$1' -> ' $1 '"; | |
| 142 } | |
| 143 elsif (/[^ =](\*|==|\.=|=>|=|\|\|)[^ =>]/ && $program && !/foreach/) { | |
| 144 $msg = "'$1' -> ' $1 '"; | |
| 145 } | |
| 146 # ensure $bar["foo"] and $bar[$foo] and $bar[0] | |
| 147 elsif (/\[[^#][^\]]*\]/ && !/\[[0-9\$][^\]]*\]/ && !/\[\]/) { | |
| 148 $msg = "only [\"foo\"], [\$foo] or [0] is allowed"; | |
| 149 } | |
| 150 # first try to find missing quotes after = in (X)HTML tags | |
| 151 elsif (/<[^>]*=[a-zA-Z0-9][^>]*>/) { | |
| 152 $msg = "=... -> =\"...\""; | |
| 153 } | |
| 154 if (defined $msg) { | |
| 155 if ($debug==0) { | |
| 156 print $ARGV .":". $. .": $msg : ". $org; | |
| 157 } | |
| 158 undef $msg; | |
| 159 } | |
| 160 elsif ($debug==1) { | |
| 161 print $org; | |
| 162 } | |
| 163 } continue { | |
| 164 close ARGV if eof; | |
| 165 } | |
| 166 | |
| 167 __END__ | |
| 168 | |
| 169 =head1 NAME | |
| 170 | |
| 171 code-style.pl - Review drupal code for style | |
| 172 | |
| 173 =head1 SYNOPSIS | |
| 174 | |
| 175 code-style.pl [options] <filename> | |
| 176 | |
| 177 Options: | |
| 178 | |
| 179 -? --help detailed help message | |
| 180 | |
| 181 =head1 DESCRIPTION | |
| 182 | |
| 183 Originally written for Drupal (http://drupal.org/) to ensure stylish | |
| 184 code. This program reviews PHP code, and tries to show as many code | |
| 185 improvements as possible with no false positives. | |
| 186 | |
| 187 =head1 OPTIONS | |
| 188 | |
| 189 --comment | |
| 190 | |
| 191 =head1 EXAMPLES | |
| 192 | |
| 193 ./code-style.pl ../index.php | |
| 194 | |
| 195 =cut |
