0337d704 |
1 | #! /usr/bin/perl -w |
2 | #*************************************************************************** |
3 | #* Copyright (C) 2003-2004 Polytechnique.org * |
4 | #* http://opensource.polytechnique.org/ * |
5 | #* * |
6 | #* This program is free software; you can redistribute it and/or modify * |
7 | #* it under the terms of the GNU General Public License as published by * |
8 | #* the Free Software Foundation; either version 2 of the License, or * |
9 | #* (at your option) any later version. * |
10 | #* * |
11 | #* This program is distributed in the hope that it will be useful, * |
12 | #* but WITHOUT ANY WARRANTY; without even the implied warranty of * |
13 | #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
14 | #* GNU General Public License for more details. * |
15 | #* * |
16 | #* You should have received a copy of the GNU General Public License * |
17 | #* along with this program; if not, write to the Free Software * |
18 | #* Foundation, Inc., * |
19 | #* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * |
20 | #*************************************************************************** |
21 | |
22 | |
23 | use strict; |
24 | my %classes; |
25 | my %styles; |
26 | |
27 | my $red="\e[1;37;31m"; |
28 | my $yel="\e[1;37;33m"; |
29 | my $blu="\e[1;37;34m"; |
30 | my $whi="\e[1;37;16m"; |
31 | my $gra="\e[0m"; |
32 | |
33 | |
34 | sub parse_dir($) { |
35 | my $dir = shift; |
36 | my @dirs; |
37 | opendir DIR,$dir; |
38 | while(my $a = readdir DIR) { |
39 | if( -d $dir."/".$a ) { |
40 | push @dirs,$dir."/".$a unless($a eq '.' or $a eq '..' or $a eq 'CVS'); |
41 | } else { |
42 | &parse_file($dir."/".$a) if($a =~ /\.(php|tpl|htm[l]?)$/i); |
43 | } |
44 | } |
45 | closedir DIR; |
46 | foreach $dir (@dirs) { &parse_dir($dir); } |
47 | } |
48 | |
49 | sub parse_file($) { |
50 | my $file = shift; |
51 | open FILE,"<$file"; |
52 | my $text = join '',(<FILE>); |
53 | $text =~ s/[\s\t\n]+/ /g; |
54 | &get_classes($file,$text); |
55 | close FILE; |
56 | } |
57 | |
58 | sub get_classes($$) { |
59 | my $file = shift; |
60 | my $text = shift; |
61 | while ($text =~ /<( *[^\/](?:->|[^>])*) *>(.*)$/) { |
62 | &parse_tag($file,$1); |
63 | $text = $2; |
64 | } |
65 | } |
66 | |
67 | sub class_add($$) { |
68 | my $file = shift; |
69 | my $tag = shift; |
70 | my $class = shift; |
71 | if (defined($classes{"$tag.$class"})) { |
72 | $classes{"$tag.$class"} .= " $file"; |
73 | } else { |
74 | $classes{"$tag.$class"} = $file; |
75 | } |
76 | } |
77 | |
78 | sub parse_tag($$) { |
79 | my $file = shift; |
80 | my $tag = shift; |
81 | |
82 | # tag interdits en xhtml |
83 | print STDERR "${red}XHTML error: ${yel}<$1> (majuscules) ${blu}($file)${gra}\n" |
84 | if($tag =~ /^((?:[A-Z]+[a-z]*)+)( |$)/); |
85 | print STDERR "${red}XHTML error: ${yel}<$1> ${blu}($file)${gra}\n" |
86 | if($tag =~ /^(b|i|u|big|small|font|center)( |$)/); |
87 | print STDERR "${red}XHTML error: ${yel}<$1> sans '/' ${blu}($file)${gra}\n" |
88 | if($tag =~ /^(br|hr|img|link|input)( [^\/]*)?$/); |
89 | |
90 | print STDERR "${red}XHTML error: ${yel}attribut $1 sans = ${blu}($file)${gra}\n" |
91 | if($tag =~ / (checked|disabled|multiple|readonly)( |$)/); |
92 | print STDERR "${red}XHTML error: ${yel}attribut $1 ${blu}($file)${gra}\n" |
93 | if($tag =~ / (align|width|border|color|valign)=/); |
94 | |
95 | # récupération des classes utilisées ... |
96 | if($tag =~ /^(\w+).* class=('{[^}]*}'|"{[^}]*}"|'[^{}']*'|"[^{}"]*")/) { |
97 | my $t = lc($1); |
98 | $2 =~ /^['"](.*)['"]$/; |
99 | my $c = lc($1); |
100 | if($c =~ /^{ ?cycle.* values=('[^']*'|"[^"]*")/) { |
101 | my @cycle = split /['",]/,$1; |
102 | foreach my $cl (@cycle) { |
103 | &class_add($file,$t,$cl) if($cl); |
104 | } |
105 | } else { |
106 | &class_add($file,$t,$c); |
107 | } |
108 | } |
109 | |
110 | #récupération des styles utilisés ... |
111 | if($tag =~ /^(\w+).* style=('{[^}]*}'|"{[^}]*}"|'[^{}']*'|"[^{}"]*")/) { |
112 | my $t = lc($1); |
113 | $2 =~ /^['"](.*)['"]$/; |
114 | my $s = lc($1); |
115 | if (defined($styles{"$t => $s"})) { |
116 | $styles{"$t => $s"} .= " $file"; |
117 | } else { |
118 | $styles{"$t => $s"} = $file; |
119 | } |
120 | } |
121 | } |
122 | |
123 | foreach my $dir (@ARGV) { |
124 | &parse_dir($dir); |
125 | } |
126 | |
127 | print "\n$blu..:: Classes ::..$gra\n\n"; |
128 | foreach my $key (sort(keys(%classes))) { |
129 | print $key,"\n"; |
130 | } |
131 | |
132 | print "\n$blu..:: Styles ::..$gra\n\n"; |
133 | foreach my $key (sort(keys(%styles))) { |
134 | print $key,"\t",$whi,$styles{$key},$gra,"\n"; |
135 | } |
136 | |
137 | print "\n"; |
138 | |
139 | # vim:set et ts=4 sts=4 sw=4: |