#!/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() { #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