| 1 |
1 |
moose |
#!/usr/bin/perl |
| 2 |
|
|
|
| 3 |
|
|
use strict; |
| 4 |
|
|
use warnings; |
| 5 |
|
|
|
| 6 |
|
|
die "Failed to open Scintilla.iface: $!\n" if !open(FH, "Scintilla.iface"); |
| 7 |
|
|
|
| 8 |
|
|
our $mode = "none"; |
| 9 |
|
|
our $prefix = ""; |
| 10 |
|
|
our %prefix; |
| 11 |
|
|
our %lex; |
| 12 |
|
|
|
| 13 |
|
|
for(<FH>) { |
| 14 |
|
|
#chomp; |
| 15 |
|
|
s/\r\n//g; |
| 16 |
|
|
next if /^\s*$/; |
| 17 |
|
|
next if /^#.*$/; |
| 18 |
|
|
if($mode ne "lex" && /^enu Lexer=(.*)$/) { |
| 19 |
|
|
# print "Prefix: $1\n"; |
| 20 |
|
|
$prefix = $1; |
| 21 |
|
|
$mode = "lex"; |
| 22 |
|
|
} |
| 23 |
|
|
elsif($mode eq "lex") { |
| 24 |
|
|
last if /^evt.*$/; |
| 25 |
|
|
|
| 26 |
|
|
# print "line: '$_'\n"; |
| 27 |
|
|
|
| 28 |
|
|
if(/^val\s+(SCLEX_\w+)=(\d+)$/) { |
| 29 |
|
|
# print "Adding $1 $2\n"; |
| 30 |
|
|
$lex{$1} = { 'id' => $2, ENUMS => [] }; |
| 31 |
|
|
} |
| 32 |
|
|
elsif(/^lex\s+([^=]+)=([^\s]+)\s+(\w+?)$/) { |
| 33 |
|
|
#$mode = "enu"; |
| 34 |
|
|
$lex{$2}{'name'} = $1; |
| 35 |
|
|
$lex{$2}{'prefix'} = $3; |
| 36 |
|
|
$prefix{$3} = [] if ref($prefix{$3}) ne "ARRAY"; |
| 37 |
|
|
# print " Adding $1 $2 $3.\n"; |
| 38 |
|
|
push @{$prefix{$3}[0]}, $2; |
| 39 |
|
|
} |
| 40 |
|
|
elsif(/^val\s+(\w[^=]+?)=(\d+)$/) { |
| 41 |
|
|
my $enam = $1; |
| 42 |
|
|
my $eval = $2; |
| 43 |
|
|
|
| 44 |
|
|
my $k = $enam; |
| 45 |
|
|
if($k =~ /^SCE_H.*$/) { |
| 46 |
|
|
$k = "SCE_H"; |
| 47 |
|
|
} |
| 48 |
|
|
else { |
| 49 |
|
|
$k = join('_', (split('_', $k))[0,1]) . "_"; |
| 50 |
|
|
} |
| 51 |
|
|
|
| 52 |
|
|
push @{$prefix{$k}[1]}, [$enam,$eval]; |
| 53 |
|
|
# print "\$k:$k\n"; |
| 54 |
|
|
=pod |
| 55 |
|
|
for my $pkey (@{$prefix{$k}}) { |
| 56 |
|
|
my $hr = $lex{$pkey}; |
| 57 |
|
|
my $pfix = $hr->{'prefix'}; |
| 58 |
|
|
|
| 59 |
|
|
$lex{$pkey}{'ENUMS'}[$eval] = $enam; |
| 60 |
|
|
# print " Adding: $pkey, $pfix, $enam, $eval\n"; |
| 61 |
|
|
} |
| 62 |
|
|
=cut |
| 63 |
|
|
} else { |
| 64 |
|
|
# print $_ . "\n"; |
| 65 |
|
|
} |
| 66 |
|
|
|
| 67 |
|
|
} |
| 68 |
|
|
} |
| 69 |
|
|
#use Data::Dumper; |
| 70 |
|
|
#print Data::Dumper->Dump([\%prefix], [qw/prefix/]); |
| 71 |
|
|
#=pod |
| 72 |
|
|
push @{$prefix{'SCE_C_'}[0]}, 'SCLEX_CPPNOCASE'; |
| 73 |
|
|
push @{$prefix{'SCE_CLW_'}[0]}, 'SCLEX_CLWNOCASE'; |
| 74 |
|
|
|
| 75 |
|
|
$lex{'SCLEX_CPPNOCASE'} = { 'name' => 'cppnocase', 'id' => $lex{'SCLEX_CPP'}{'id'}, 'ENUMS' => $lex{'SCLEX_CPP'}{'ENUMS'} }; |
| 76 |
|
|
$lex{'SCLEX_CLWNOCASE'} = { 'name' => 'clwnocase', 'id' => $lex{'SCLEX_CLW'}{'id'}, 'ENUMS' => $lex{'SCLEX_CLW'}{'ENUMS'} }; |
| 77 |
|
|
|
| 78 |
|
|
for my $pf (keys %prefix) { |
| 79 |
|
|
my $names = $prefix{$pf}->[0]; |
| 80 |
|
|
my $enums = $prefix{$pf}->[1]; |
| 81 |
|
|
|
| 82 |
|
|
for(@$names) { |
| 83 |
|
|
$lex{$_}{'ENUMS'} = $enums; |
| 84 |
|
|
} |
| 85 |
|
|
|
| 86 |
|
|
} |
| 87 |
|
|
#=cut |
| 88 |
|
|
|
| 89 |
|
|
close FH; |
| 90 |
|
|
|
| 91 |
|
|
# map header names to actual names... |
| 92 |
|
|
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/; |
| 93 |
|
|
|
| 94 |
|
|
# delete these ones since they don't exist |
| 95 |
|
|
$mapping{'container'} = $mapping{'automatic'} = $mapping{'xcode'} = $mapping{'v'} = $mapping{'c'} = undef; |
| 96 |
|
|
$mapping{'sn'} = $mapping{'pl'} = $mapping{'matlab'} = $mapping{'make'} = $mapping{'l'} = $mapping{'f'} = undef; |
| 97 |
|
|
$mapping{'err'} = $mapping{'bat'} = $mapping{'sh'} = undef; |
| 98 |
|
|
|
| 99 |
|
|
for my $lex (sort keys %lex) { |
| 100 |
|
|
if(!exists $lex{$lex}{'name'} || !defined $lex{$lex}{'name'}) { |
| 101 |
|
|
$lex =~ s/$prefix//; |
| 102 |
|
|
my $name = lc($lex); |
| 103 |
|
|
$name = exists $mapping{$name} ? $mapping{$name} : $name; |
| 104 |
|
|
next if !defined $name; |
| 105 |
|
|
print $lex . " ". $name . "\n"; |
| 106 |
|
|
next; |
| 107 |
|
|
} |
| 108 |
|
|
my $name = lc($lex{$lex}{'name'}); |
| 109 |
|
|
$name = exists $mapping{$name} ? $mapping{$name} : $name; |
| 110 |
|
|
next if !defined $name; |
| 111 |
|
|
print $lex . " ".$name . "\n"; |
| 112 |
|
|
my @arr = @{$lex{$lex}{'ENUMS'}}; |
| 113 |
|
|
for (my $i=0; $i < scalar @arr; ++$i) { |
| 114 |
|
|
next if !defined $arr[$i]; |
| 115 |
|
|
my $n = lc $arr[$i]->[0]; |
| 116 |
|
|
#$n =~ s/sce_h_?/$name\_/; |
| 117 |
|
|
$n =~ s/sce_h?_?//; |
| 118 |
|
|
$n =~ s/$name\_//; |
| 119 |
|
|
my @a = split('_', $n); |
| 120 |
|
|
$a[0] = exists $mapping{$a[0]} ? $mapping{$a[0]} : $a[0]; |
| 121 |
|
|
shift @a if !defined $a[0] || $name =~ /^(vb|ruby|python|powerbasic|eiffelkw|clwnocase)/; |
| 122 |
|
|
$n = join(' ', @a); |
| 123 |
|
|
|
| 124 |
|
|
print "\t" . $n . ": " . $arr[$i]->[1] . "\n"; |
| 125 |
|
|
} |
| 126 |
|
|
} |
| 127 |
|
|
|
| 128 |
|
|
=pod |
| 129 |
|
|
|
| 130 |
|
|
ALRIGHT: think about making QScintilla's lexer stuff way more flexible... currently the lexers hardcode colors and fonts :o |
| 131 |
|
|
ALSO: use Scintilla's properties thing... and the .properties files. |
| 132 |
|
|
|
| 133 |
|
|
enu Lexer=SCLEX_ |
| 134 |
|
|
... |
| 135 |
|
|
val SCLEX_PYTHON=2 |
| 136 |
|
|
... |
| 137 |
|
|
lex Python=SCLEX_PYTHON SCE_P_ |
| 138 |
|
|
lex Ruby=SCLEX_RUBY SCE_P_ |
| 139 |
|
|
val SCE_P_DEFAULT=0 |
| 140 |
|
|
=cut |