Home | History | Annotate | Download | only in Scripts
      1 #!/usr/bin/perl -w
      2 
      3 # Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
      4 #
      5 # Redistribution and use in source and binary forms, with or without
      6 # modification, are permitted provided that the following conditions
      7 # are met:
      8 #
      9 # 1.  Redistributions of source code must retain the above copyright
     10 #     notice, this list of conditions and the following disclaimer. 
     11 # 2.  Redistributions in binary form must reproduce the above copyright
     12 #     notice, this list of conditions and the following disclaimer in the
     13 #     documentation and/or other materials provided with the distribution. 
     14 # 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
     15 #     its contributors may be used to endorse or promote products derived
     16 #     from this software without specific prior written permission. 
     17 #
     18 # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     19 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     20 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     21 # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     22 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     23 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     24 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     25 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 
     29 # Script to generate HTML wrappers for JavaScript tests from templates
     30 
     31 use strict;
     32 
     33 use FindBin;
     34 use lib $FindBin::Bin;
     35 
     36 use File::Basename;
     37 use File::Find;
     38 use Getopt::Long;
     39 use webkitdirs;
     40 
     41 sub directoryFilter;
     42 sub findTemplateFiles(@);
     43 
     44 my $showHelp;
     45 
     46 my $result = GetOptions(
     47     "help"       => \$showHelp,
     48 );
     49 
     50 if (!$result || $showHelp) {
     51     print STDERR basename($0) . " [-h|--help] [path ...]\n";
     52     exit 1;
     53 }
     54 
     55 setConfiguration();
     56 my $productDir = productDir();
     57 
     58 chdirWebKit();
     59 
     60 my @templates = findTemplateFiles(@ARGV);
     61 
     62 for my $tfile (@templates) {
     63 
     64     my $tpath = $tfile;
     65     my $templateDirectory;
     66     my $templateRelativePath;
     67     if ($tpath =~ s:/(script-tests)/TEMPLATE.html$::) {
     68         $templateDirectory = $1;
     69         $templateRelativePath = $1 . "/TEMPLATE.html";
     70     } else {
     71         print "Inappropriate position of a template: ${tpath}\n";
     72         next;
     73     }
     74 
     75     print "${tpath}\n";
     76 
     77     chdirWebKit();
     78     chdir($tpath);
     79 
     80     my @files;
     81     my $fileFilter = sub {
     82         push @files, $File::Find::name if substr($_, -3) eq ".js";
     83     };
     84     find({ preprocess => \&directoryFilter, wanted => $fileFilter }, $templateDirectory);
     85 
     86     open TEMPLATE, "<${templateRelativePath}";
     87     my $template = do { local $/; <TEMPLATE> };
     88     close TEMPLATE;
     89 
     90     my $templateNegative = $template;
     91     if (-e "${templateDirectory}/TEMPLATE-n.html") {
     92         open TEMPLATE, "<${templateDirectory}/TEMPLATE-n.html";
     93         $templateNegative = do { local $/; <TEMPLATE> };
     94         close TEMPLATE;
     95     }
     96 
     97     for my $file (@files) {
     98         my $html = $file;
     99         $html =~ s:${templateDirectory}/(.*)\.js:$1.html:;
    100         next if -f "$html-disabled";
    101 
    102         system("cat ${file} | tr '\\0' ' ' | grep -q 'successfullyParsed ='");
    103         if ($? != 0) {
    104             `echo "" >> "${file}"`;
    105             `echo "var successfullyParsed = true;" >> "${file}"`;
    106         }
    107         
    108         print "    ${html}\n";
    109         open HTML, ">$html";
    110         my $output = ($file =~ /-n\.js/) ? $templateNegative : $template;
    111         $output =~ s:YOUR_JS_FILE_HERE:$file:;
    112         print HTML $output;
    113         
    114         close HTML;
    115     }
    116 }
    117 
    118 exit 0;
    119 
    120 sub directoryFilter
    121 {
    122     return () if basename($File::Find::dir) eq ".svn";
    123     return @_;
    124 }
    125 
    126 sub findTemplateFiles(@) {
    127     my @args = @_;
    128     my @templateFiles;
    129 
    130     push @args, "LayoutTests" if scalar(@args) == 0;
    131 
    132     my @paths = map { -f $_ ? dirname($_) : $_ } @args;
    133 
    134     my $fileFilter = sub {
    135         push @templateFiles, $File::Find::name if $_ eq "TEMPLATE.html";
    136     };
    137 
    138     find({ preprocess => \&directoryFilter, wanted => $fileFilter }, @paths);
    139 
    140     return @templateFiles;
    141 }
    142