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