Line # Revision Author
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