#!/usr/bin/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::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);
}

