#!/usr/bin/env perl

# Copyright (C) 2007 Apple Inc.  All rights reserved.
# Copyright (C) 2010 Holger Hans Peter Freyther
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer. 
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution. 
# 3.  Neither the name of Apple Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission. 
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# This script updates Tools/iExploder/iExploder-1.3.2/htdocs/*.in based on
# WebCore/css/CSSPropertyNames.in, WebCore/html/HTMLTagNames.in
# and WebCore/html/HTMLAttributeNames.in

use warnings;
use strict;

use FindBin;
use lib $FindBin::Bin;
use VCSUtils;
use webkitdirs;

use File::Basename;
use File::Spec;

sub generateEntityListFromFile($);
sub readiExploderFile($);
sub update($$);
sub writeiExploderFile($@);

update("cssproperties.in", "css/CSSPropertyNames.in");
update("htmlattrs.in", "html/HTMLAttributeNames.in");
update("htmltags.in", "html/HTMLTagNames.in");
print "Successfully updated!\n";

exit 0;

sub generateEntityListFromFile($)
{
    my ($filename) = @_;

    my $revision = svnRevisionForDirectory(dirname($filename));
    my $path = File::Spec->abs2rel($filename, sourceDir());
    my $result = "# From WebKit svn r" . $revision . " (" . $path . ")\n";

    my @entities = ();
    my $in_namespace = 0;

    open(IN, $filename) || die "$!";
    while (my $l = <IN>) {
        chomp $l;
        if ($l =~ m/^namespace=\"/) {
            $in_namespace = 1;
        } elsif ($in_namespace && $l =~ m/^$/) {
            $in_namespace = 0;
        }

        next if $in_namespace;
        next if $l =~ m/^\s*#/ || $l =~ m/^\s*$/;

        # For HTML Tags that can have additional information
        if ($l =~ m/ /) {
            my @split = split / /, $l;
            $l = $split[0]
        }

        push(@entities, $l);
    }
    close(IN);

    $result .= join("\n", sort { $a cmp $b } @entities) . "\n\n";

    return $result;
}

sub readiExploderFile($)
{
    my ($filename) = @_;

    my @sections = ();
    local $/ = "\n\n";

    open(IN, $filename) || die "$!";
    @sections = <IN>;
    close(IN);

    return @sections;
}

sub update($$)
{
    my ($iexploderPath, $webcorePath) = @_;

    $iexploderPath = File::Spec->catfile(sourceDir(), "Tools", "iExploder", "iExploder-1.3.2", "htdocs", split("/", $iexploderPath));
    $webcorePath = File::Spec->catfile(sourceDir(), "Source", "WebCore", split("/", $webcorePath));

    my @sections = readiExploderFile($iexploderPath);
    $sections[0] = generateEntityListFromFile($webcorePath);
    writeiExploderFile($iexploderPath, @sections);
}


sub writeiExploderFile($@)
{
    my ($filename, @sections) = @_;

    open(OUT, "> $filename") || die "$!";
    print OUT join("", @sections);
    close(OUT);
}

