Modest/utils/MyHTML/namespace.pl

134 lines
3.8 KiB
Perl
Raw Normal View History

2016-12-26 16:58:10 +03:00
#!/usr/bin/perl -w
BEGIN {
use FindBin;
push @INC, $FindBin::Bin. "/../ext/";
};
use utf8;
use strict;
use MyHTML::Base;
use JSON::XS;
my $static_list_index_length = 19;
my $utils = MyHTML::Base->new(dirs => {source => "../source/myhtml", template => "tmpl"});
my $result = create_result($static_list_index_length);
my $static_list = create_static_list_index($result);
print $static_list, "\n";
sub create_result {
my ($static_list_index_length) = @_;
my $result = {};
foreach my $ns (qw( HTML MATHML SVG XLINK XML XMLNS )) {
my $id = get_index_id($ns, $static_list_index_length);
push @{$result->{$id}}, [$ns, length($ns)];
}
$result;
}
sub test_result {
my $op = [0, undef];
foreach my $idx (1..1024) {
my $result = create_result($idx);
my $res_max = test_result_max_value($result, 0);
if(!defined($op->[1]) || $op->[1] > $res_max) {
$op->[0] = $idx;
$op->[1] = $res_max;
}
}
print "Best:\n";
print $op->[0], ": ", $op->[1], "\n";
}
sub test_result_max_value {
my ($res, $is_print) = @_;
my $max = 0;
foreach my $id (sort {scalar(@{$res->{$a}}) <=> scalar(@{$res->{$b}})} keys %$res) {
print "$id: ", scalar(@{$res->{$id}}), "\n" if $is_print;
$max = scalar(@{$res->{$id}}) if $max < scalar(@{$res->{$id}});
}
$max;
}
sub get_index_id {
use bytes;
my @chars = split //, $_[0];
my $f = ord(lc($chars[0]));
my $l = ord(lc($chars[-1]));
((($f * $l * scalar(@chars))) % $_[1]) + 1;
}
sub create_sub_static_list_index {
my ($result, $struct, $offset) = @_;
my @list_sorted = sort {$a->[1] <=> $b->[1]} @$result[0..$#$result];
foreach my $i (1..$#list_sorted) {
my $cur = $offset;
$offset++;
push @$struct, "\t{".
'"'. $list_sorted[$i]->[0] .'", '. $list_sorted[$i]->[1] .', '.
"MyHTML_NAMESPACE_". uc($list_sorted[$i]->[0]), ', '.
($i < $#list_sorted ? $offset : 0) .", $cur},\n";
}
$offset;
}
sub create_static_list_index {
my ($result) = @_;
my @res;
my $struct = [];
my $offset = $static_list_index_length + 1;
foreach my $i (0..$static_list_index_length)
{
if(exists $result->{$i}) {
my $id = 0;
if(scalar @{$result->{$i}} > 1) {
$offset = create_sub_static_list_index($result->{$i}, $struct, $offset);
$id = $offset - (@{$result->{$i}} - 1);
}
my @list_sorted = sort {$a->[1] <=> $b->[1]} @{$result->{$i}}[0..$#{$result->{$i}}];
push @res, "\t{".
'"'. $list_sorted[0]->[0] .'", '. $list_sorted[0]->[1] .', '.
"MyHTML_NAMESPACE_". uc($list_sorted[0]->[0]), ', '.
"$id, $i},\n";
}
else {
push @res, "\t{NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0},\n";
}
}
"static const myhtml_namespace_detect_name_entry_t myhtml_namespace_detect_name_entry_static_list_index[] = \n{\n". join("", @res, @$struct) ."};\n"
}
sub name_to_myhtml_encoding {
my ($name) = @_;
$name =~ s/[-]+/_/g;
$name = "MyHTML_ENCODING_". uc($name);
$name;
}