1 # Copyright (c) 2006 Hans Jeuken. All rights reserved.
2 # This program is free software; you can redistribute it and/or
3 # modify it under the same terms as Perl itself.
5 package Syntax::Highlight::Engine::Kate::XMLData;
12 our $VERSION = '0.06';
14 my $regchars = "\\^.\$|()[]{}*+?~!%^&/";
18 my $class = ref($proto) || $proto;
21 unless (defined($file)) { $file = ''; }
25 adddeliminators => '',
26 weakdeliminators => '',
34 bless ($self, $class);
44 if (@_) { $self->{'basecontext'} = shift }
45 return $self->{'basecontext'}
50 if (@_) { $self->{'contexts'} = shift }
51 return $self->{'contexts'}
54 sub additionalDeliminator {
56 if (@_) { $self->{'adddeliminators'} = shift }
57 return $self->{'adddeliminators'}
62 if (@_) { $self->{'weakdeliminators'} = shift }
63 return $self->{'weakdeliminators'}
68 if (@_) { $self->{'filename'} = shift }
69 return $self->{'filename'}
73 my ($self, $parser) = @_;
75 while (my $token = $parser->get_token) {
76 if ($token->[0] eq 'S') {
78 $t->{'type'} = $token->[1];
79 my @items = $self->getItems($parser);
81 $t->{'items'} = \@items
84 } elsif ($token->[0] eq 'E') {
92 if (@_) { $self->{'itemdata'} = shift }
93 return $self->{'itemdata'}
98 if (@_) { $self->{'keywordscase'} = shift }
99 return $self->{'keywordscase'}
103 my ($self, $file) = @_;
104 unless (open KATE, "<$file") { die "cannot open $file"; };
105 print "loading $file\n";
106 my $parser = new XML::TokeParser(\*KATE, Noempty => 1);
111 while (my $token = $parser->get_token) {
112 if ($mode eq 'base') {
113 if ($token->[0] eq 'S') {
114 if ($token->[1] eq 'language') {
115 my $args = $token->[2];
116 $self->language($args);
117 } elsif ($token->[1] eq 'list') {
118 $curitem = $token->[2]->{'name'};
119 # print "current list '$curitem'\n";
121 } elsif ($token->[1] eq 'context') {
122 my $ctx = delete $token->[2]->{'name'};
123 unless (defined($ctx)) { $ctx ='noname' };
124 # print "current context '$ctx'\n";
125 my $ar = $token->[2];
127 if ($self->basecontext eq '') {
128 $self->basecontext($ctx);
130 my @items = $self->getItems($parser);
131 if (@items) { $args{'items'} = \@items };
132 $self->contexts->{$ctx} = \%args;
133 } elsif ($token->[1] eq 'itemData') {
134 my $style = $token->[2]->{'defStyleNum'};
135 unless (defined($style)) { $style = '';};
137 $self->itemdata->{$token->[2]->{'name'}} = $style;
138 } elsif ($token->[1] eq 'keywords') {
139 my $case = delete $token->[2]->{'casesensitive'};
140 if (defined($case)) {
141 if (lc($case) eq 'true') {
142 $self->keywordscase(1);
144 $self->keywordscase(0);
147 my $wdelim = delete $token->[2]->{'weakDeliminator'};
148 if (defined($wdelim)) {
149 $self->weakDeliminator($wdelim)
151 my $adelim = delete $token->[2]->{'additionalDeliminator'};
152 if (defined($wdelim)) {
153 $self->additionalDeliminator($wdelim)
157 } elsif ($mode eq 'list') {
158 if ($token->[0] eq 'T') {
159 my $tx = $token->[1];
163 } elsif ($token->[0] eq 'E') {
164 if ($token->[1] eq 'list') {
165 $self->lists->{$curitem} = [ @curlist ];
174 $self->filename($file);
179 if (@_) { $self->{'language'} = shift }
180 return $self->{'language'}
185 if (@_) { $self->{'lists'} = shift }
186 return $self->{'lists'}
192 my $m = $self->{'metadata'};
197 if (exists $m->{$key}) {
205 my $m = $self->{'metadata'};
206 my $dstr = Dumper($m);
214 if (@_) { $self->{'samplefile'} = shift }
215 return $self->{'samplefile'};