| Revision 1 (by moose, 2006/03/06 10:35:57) |
Initial Import
|
#!/usr/bin/perl
use strict;
use warnings;
die "Failed to open Scintilla.iface: $!\n" if !open(FH, "Scintilla.iface");
our $mode = "none";
our $prefix = "";
our %prefix;
our %lex;
for(<FH>) {
#chomp;
s/\r\n//g;
next if /^\s*$/;
next if /^#.*$/;
if($mode ne "lex" && /^enu Lexer=(.*)$/) {
# print "Prefix: $1\n";
$prefix = $1;
$mode = "lex";
}
elsif($mode eq "lex") {
last if /^evt.*$/;
# print "line: '$_'\n";
if(/^val\s+(SCLEX_\w+)=(\d+)$/) {
# print "Adding $1 $2\n";
$lex{$1} = { 'id' => $2, ENUMS => [] };
}
elsif(/^lex\s+([^=]+)=([^\s]+)\s+(\w+?)$/) {
#$mode = "enu";
$lex{$2}{'name'} = $1;
$lex{$2}{'prefix'} = $3;
$prefix{$3} = [] if ref($prefix{$3}) ne "ARRAY";
# print " Adding $1 $2 $3.\n";
push @{$prefix{$3}[0]}, $2;
}
elsif(/^val\s+(\w[^=]+?)=(\d+)$/) {
my $enam = $1;
my $eval = $2;
my $k = $enam;
if($k =~ /^SCE_H.*$/) {
$k = "SCE_H";
}
else {
$k = join('_', (split('_', $k))[0,1]) . "_";
}
push @{$prefix{$k}[1]}, [$enam,$eval];
# print "\$k:$k\n";
=pod
for my $pkey (@{$prefix{$k}}) {
my $hr = $lex{$pkey};
my $pfix = $hr->{'prefix'};
$lex{$pkey}{'ENUMS'}[$eval] = $enam;
# print " Adding: $pkey, $pfix, $enam, $eval\n";
}
=cut
} else {
# print $_ . "\n";
}
}
}
#use Data::Dumper;
#print Data::Dumper->Dump([\%prefix], [qw/prefix/]);
#=pod
push @{$prefix{'SCE_C_'}[0]}, 'SCLEX_CPPNOCASE';
push @{$prefix{'SCE_CLW_'}[0]}, 'SCLEX_CLWNOCASE';
$lex{'SCLEX_CPPNOCASE'} = { 'name' => 'cppnocase', 'id' => $lex{'SCLEX_CPP'}{'id'}, 'ENUMS' => $lex{'SCLEX_CPP'}{'ENUMS'} };
$lex{'SCLEX_CLWNOCASE'} = { 'name' => 'clwnocase', 'id' => $lex{'SCLEX_CLW'}{'id'}, 'ENUMS' => $lex{'SCLEX_CLW'}{'ENUMS'} };
for my $pf (keys %prefix) {
my $names = $prefix{$pf}->[0];
my $enums = $prefix{$pf}->[1];
for(@$names) {
$lex{$_}{'ENUMS'} = $enums;
}
}
#=cut
close FH;
# map header names to actual names...
our %mapping = qw/html hypertext avenue ave properties props clarion clw sol scriptol a asp j javascript ja asp-javascript b basic ba asp-basic pa asp-python p python/;
# delete these ones since they don't exist
$mapping{'container'} = $mapping{'automatic'} = $mapping{'xcode'} = $mapping{'v'} = $mapping{'c'} = undef;
$mapping{'sn'} = $mapping{'pl'} = $mapping{'matlab'} = $mapping{'make'} = $mapping{'l'} = $mapping{'f'} = undef;
$mapping{'err'} = $mapping{'bat'} = $mapping{'sh'} = undef;
for my $lex (sort keys %lex) {
if(!exists $lex{$lex}{'name'} || !defined $lex{$lex}{'name'}) {
$lex =~ s/$prefix//;
my $name = lc($lex);
$name = exists $mapping{$name} ? $mapping{$name} : $name;
next if !defined $name;
print $lex . " ". $name . "\n";
next;
}
my $name = lc($lex{$lex}{'name'});
$name = exists $mapping{$name} ? $mapping{$name} : $name;
next if !defined $name;
print $lex . " ".$name . "\n";
my @arr = @{$lex{$lex}{'ENUMS'}};
for (my $i=0; $i < scalar @arr; ++$i) {
next if !defined $arr[$i];
my $n = lc $arr[$i]->[0];
#$n =~ s/sce_h_?/$name\_/;
$n =~ s/sce_h?_?//;
$n =~ s/$name\_//;
my @a = split('_', $n);
$a[0] = exists $mapping{$a[0]} ? $mapping{$a[0]} : $a[0];
shift @a if !defined $a[0] || $name =~ /^(vb|ruby|python|powerbasic|eiffelkw|clwnocase)/;
$n = join(' ', @a);
print "\t" . $n . ": " . $arr[$i]->[1] . "\n";
}
}
=pod
ALRIGHT: think about making QScintilla's lexer stuff way more flexible... currently the lexers hardcode colors and fonts :o
ALSO: use Scintilla's properties thing... and the .properties files.
enu Lexer=SCLEX_
...
val SCLEX_PYTHON=2
...
lex Python=SCLEX_PYTHON SCE_P_
lex Ruby=SCLEX_RUBY SCE_P_
val SCE_P_DEFAULT=0
=cut