1# Copyright (c) 2005 - 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.
4
5# This file was generated from the 'inform.xml' file of the syntax highlight
6# engine of the kate text editor (http://www.kate-editor.org
7
8#kate xml version 1.23
9#kate version 2.3
10#kate author Giancarlo Niccolai (giancarlo@niccolai.ws)
11#generated: Sun Feb  3 22:02:05 2008, localtime
12
13package Syntax::Highlight::Engine::Kate::Inform;
14
15our $VERSION = '0.14';
16
17use strict;
18use warnings;
19use base('Syntax::Highlight::Engine::Kate::Template');
20
21sub new {
22   my $proto = shift;
23   my $class = ref($proto) || $proto;
24   my $self = $class->SUPER::new(@_);
25   $self->attributes({
26      'Actions' => 'DataType',
27      'Comment' => 'Comment',
28      'Function' => 'Function',
29      'Keyword' => 'Keyword',
30      'Normal Text' => 'Normal',
31      'Number' => 'DecVal',
32      'OpCode' => 'Reserved',
33      'Operator' => 'Operator',
34      'Pragma' => 'Others',
35      'PredefFunction' => 'Function',
36      'String' => 'String',
37      'Values' => 'BaseN',
38      'Word' => 'IString',
39   });
40   $self->listAdd('ClassDeclOps',
41      'has',
42      'private',
43      'with',
44   );
45   $self->listAdd('actions',
46      'Answer',
47      'Ask',
48      'AskFor',
49      'Attack',
50      'Blow',
51      'Burn',
52      'Buy',
53      'Climb',
54      'Climb',
55      'Close',
56      'Consult',
57      'Cut',
58      'Dig',
59      'Disrobe',
60      'Drink',
61      'Drop',
62      'Eat',
63      'Empty',
64      'Empty',
65      'EmptyT',
66      'Enter',
67      'Examine',
68      'Exit',
69      'Fill',
70      'FullScore',
71      'GetOff',
72      'GetOff',
73      'Give',
74      'Go',
75      'GoIn',
76      'GoIn',
77      'Insert',
78      'Inv',
79      'Inv',
80      'InvTall',
81      'InvWide',
82      'Jump',
83      'JumpOn',
84      'Kiss',
85      'LMode1',
86      'LMode2',
87      'LMode3',
88      'LetGo',
89      'Listen',
90      'Lock',
91      'Look',
92      'Mild',
93      'No',
94      'NotifyOff',
95      'NotifyOn',
96      'Objects',
97      'Open',
98      'Places',
99      'Pray',
100      'Pronouns',
101      'Pull',
102      'Push',
103      'PushDir',
104      'PutOn',
105      'Quit',
106      'Receive',
107      'Restart',
108      'Restore',
109      'Rub',
110      'Save',
111      'Score',
112      'ScriptOff',
113      'ScriptOn',
114      'Search',
115      'Set',
116      'SetTo',
117      'Show',
118      'Sing',
119      'Sing',
120      'Sing',
121      'Sleep',
122      'Smell',
123      'Sorry',
124      'Squeeze',
125      'Strong',
126      'Swim',
127      'Swing',
128      'SwitchOff',
129      'SwitchOn',
130      'Take',
131      'Taste',
132      'Tell',
133      'Think',
134      'ThrowAt',
135      'ThrownAt',
136      'Tie',
137      'Touch',
138      'Transfer',
139      'Turn',
140      'Unlock',
141      'VagueGo',
142      'Verify',
143      'Version',
144      'Wave',
145      'WaveHands',
146      'Wear',
147      'Yes',
148   );
149   $self->listAdd('functions',
150      'Achieved',
151      'AddToScope',
152      'CDefArt',
153      'ChangeDefault',
154      'DefArt',
155      'DoMenu',
156      'EnglishNumber',
157      'HasLightSource',
158      'InDefArt',
159      'Locale',
160      'LoopOverScope',
161      'NextWord',
162      'NextWordStopped',
163      'NounDomain',
164      'ObjectIsUntouchable',
165      'OffersLight',
166      'PlaceInScope',
167      'PlayerTo',
168      'PrintShortName',
169      'ScopeWithin',
170      'SetTime',
171      'StartDaemon',
172      'StartTimer',
173      'StopDaemon',
174      'StopTimer',
175      'TestScope',
176      'TryNumber',
177      'UnsignedCompare',
178      'WordAddress',
179      'WordLenght',
180      'WriteListFrom',
181      'YesOrNo',
182      'ZRegion',
183      'allowpushdir',
184      'child',
185      'children',
186      'metaclass',
187      'parent',
188   );
189   $self->listAdd('inline_pragmas',
190      '#else',
191      '#endif',
192      '#ifdef',
193      '#ifndef',
194   );
195   $self->listAdd('keywords',
196      'box',
197      'break',
198      'continue',
199      'do',
200      'else',
201      'font',
202      'for',
203      'give',
204      'if',
205      'inversion',
206      'jump',
207      'move',
208      'new_line',
209      'objectloop',
210      'on',
211      'print',
212      'print_ret',
213      'quit',
214      'read',
215      'remove',
216      'restore',
217      'return',
218      'rfalse',
219      'rtrue',
220      'save',
221      'spaces',
222      'spring',
223      'style',
224      'switch',
225      'to',
226      'until',
227   );
228   $self->listAdd('operators',
229      'has',
230      'hasn\\\'t',
231      'in',
232      'notin',
233      'ofclass',
234      'or',
235      'provides',
236   );
237   $self->listAdd('pragmas',
238      'Abbreviate',
239      'Array',
240      'Attribute',
241      'Constant',
242      'Default',
243      'End',
244      'Endif',
245      'Extend',
246      'Global',
247      'Ifdef',
248      'Iffalse',
249      'Iffalse',
250      'Ifndef',
251      'Ifnot',
252      'Ifnot',
253      'Iftrue',
254      'Iftrue',
255      'Import',
256      'Include',
257      'Link',
258      'Lowstring',
259      'Message',
260      'Property',
261      'Release',
262      'Replace',
263      'Serial',
264      'Statusline',
265      'Switches',
266      'System_file',
267      'Verb',
268      'score',
269   );
270   $self->listAdd('special_vals',
271      'Routine',
272      'String',
273      'action',
274      'actor',
275      'actors_location',
276      'bold',
277      'buffer',
278      'consult_from',
279      'consult_words',
280      'false',
281      'fixed',
282      'location',
283      'nothing',
284      'noun',
285      'off',
286      'on',
287      'player',
288      'roman',
289      'score',
290      'second',
291      'self',
292      'sender',
293      'the_time',
294      'true',
295      'underline',
296      'wn',
297   );
298   $self->contextdata({
299      'ClassDecl' => {
300         callback => \&parseClassDecl,
301         attribute => 'Normal Text',
302         lineending => 'ClassDecl_1',
303      },
304      'ClassDecl_1' => {
305         callback => \&parseClassDecl_1,
306         attribute => 'Normal Text',
307      },
308      'Normal' => {
309         callback => \&parseNormal,
310         attribute => 'Normal Text',
311      },
312      'PropDefVal rules' => {
313         callback => \&parsePropDefValrules,
314         attribute => 'Normal Text',
315      },
316      'TopLevel' => {
317         callback => \&parseTopLevel,
318         attribute => 'Normal Text',
319      },
320      'comment' => {
321         callback => \&parsecomment,
322         attribute => 'Comment',
323         lineending => '#pop',
324      },
325      'funcdef' => {
326         callback => \&parsefuncdef,
327         attribute => 'Normal Text',
328      },
329      'has_decl' => {
330         callback => \&parsehas_decl,
331         attribute => 'Normal Text',
332      },
333      'prop_def' => {
334         callback => \&parseprop_def,
335         attribute => 'Normal Text',
336      },
337      'prop_func_def' => {
338         callback => \&parseprop_func_def,
339         attribute => 'Normal Text',
340      },
341      'string' => {
342         callback => \&parsestring,
343         attribute => 'String',
344      },
345      'word' => {
346         callback => \&parseword,
347         attribute => 'Word',
348         lineending => '#pop',
349      },
350   });
351   $self->deliminators('\\s||\\.|\\(|\\)|:|\\!|\\+|,|-|<|=|>|\\%|\\&|\\*|\\/|;|\\?|\\[|\\]|\\^|\\{|\\||\\}|\\~|\\\\');
352   $self->basecontext('TopLevel');
353   $self->keywordscase(0);
354   $self->initialize;
355   bless ($self, $class);
356   return $self;
357}
358
359sub language {
360   return 'Inform';
361}
362
363sub parseClassDecl {
364   my ($self, $text) = @_;
365   # context => 'PropDefVal rules'
366   # type => 'IncludeRules'
367   if ($self->includeRules('PropDefVal rules', $text)) {
368      return 1
369   }
370   return 0;
371};
372
373sub parseClassDecl_1 {
374   my ($self, $text) = @_;
375   # String => '^[\t ]*has '
376   # attribute => 'Keyword'
377   # context => 'has_decl'
378   # insensitive => 'TRUE'
379   # type => 'RegExpr'
380   if ($self->testRegExpr($text, '^[\\t ]*has ', 1, 0, 0, undef, 0, 'has_decl', 'Keyword')) {
381      return 1
382   }
383   # String => 'ClassDeclOps'
384   # attribute => 'Keyword'
385   # context => '#stay'
386   # type => 'keyword'
387   if ($self->testKeyword($text, 'ClassDeclOps', 0, undef, 0, '#stay', 'Keyword')) {
388      return 1
389   }
390   # String => '[a-zA-Z_]+\w*'
391   # attribute => 'Function'
392   # context => 'prop_def'
393   # type => 'RegExpr'
394   if ($self->testRegExpr($text, '[a-zA-Z_]+\\w*', 0, 0, 0, undef, 0, 'prop_def', 'Function')) {
395      return 1
396   }
397   # attribute => 'Pragma'
398   # char => ';'
399   # context => '#pop'
400   # endRegion => 'reg_class'
401   # type => 'DetectChar'
402   if ($self->testDetectChar($text, ';', 0, 0, 0, undef, 0, '#pop', 'Pragma')) {
403      return 1
404   }
405   return 0;
406};
407
408sub parseNormal {
409   my ($self, $text) = @_;
410   # attribute => 'Comment'
411   # char => '!'
412   # context => 'comment'
413   # type => 'DetectChar'
414   if ($self->testDetectChar($text, '!', 0, 0, 0, undef, 0, 'comment', 'Comment')) {
415      return 1
416   }
417   # attribute => 'String'
418   # char => '"'
419   # context => 'string'
420   # type => 'DetectChar'
421   if ($self->testDetectChar($text, '"', 0, 0, 0, undef, 0, 'string', 'String')) {
422      return 1
423   }
424   # attribute => 'Word'
425   # char => '''
426   # context => 'word'
427   # type => 'DetectChar'
428   if ($self->testDetectChar($text, '\'', 0, 0, 0, undef, 0, 'word', 'Word')) {
429      return 1
430   }
431   # String => 'inline_pragmas'
432   # attribute => 'Pragma'
433   # context => '#stay'
434   # type => 'keyword'
435   if ($self->testKeyword($text, 'inline_pragmas', 0, undef, 0, '#stay', 'Pragma')) {
436      return 1
437   }
438   # String => '--?>'
439   # attribute => 'Operator'
440   # context => '#stay'
441   # type => 'RegExpr'
442   if ($self->testRegExpr($text, '--?>', 0, 0, 0, undef, 0, '#stay', 'Operator')) {
443      return 1
444   }
445   # String => 'keywords'
446   # attribute => 'Keyword'
447   # context => '#stay'
448   # type => 'keyword'
449   if ($self->testKeyword($text, 'keywords', 0, undef, 0, '#stay', 'Keyword')) {
450      return 1
451   }
452   # String => 'actions'
453   # attribute => 'Actions'
454   # context => '#stay'
455   # type => 'keyword'
456   if ($self->testKeyword($text, 'actions', 0, undef, 0, '#stay', 'Actions')) {
457      return 1
458   }
459   # String => 'functions'
460   # attribute => 'PredefFunction'
461   # context => '#stay'
462   # type => 'keyword'
463   if ($self->testKeyword($text, 'functions', 0, undef, 0, '#stay', 'PredefFunction')) {
464      return 1
465   }
466   # String => 'special_vals'
467   # attribute => 'Values'
468   # context => '#stay'
469   # type => 'keyword'
470   if ($self->testKeyword($text, 'special_vals', 0, undef, 0, '#stay', 'Values')) {
471      return 1
472   }
473   # String => 'operators'
474   # attribute => 'Operator'
475   # context => '#stay'
476   # type => 'keyword'
477   if ($self->testKeyword($text, 'operators', 0, undef, 0, '#stay', 'Operator')) {
478      return 1
479   }
480   # String => '##[a-zA-Z_]+\w*'
481   # attribute => 'Actions'
482   # context => '#stay'
483   # type => 'RegExpr'
484   if ($self->testRegExpr($text, '##[a-zA-Z_]+\\w*', 0, 0, 0, undef, 0, '#stay', 'Actions')) {
485      return 1
486   }
487   # String => '@[a-zA-Z_]+\w*'
488   # attribute => 'OpCode'
489   # context => '#stay'
490   # type => 'RegExpr'
491   if ($self->testRegExpr($text, '@[a-zA-Z_]+\\w*', 0, 0, 0, undef, 0, '#stay', 'OpCode')) {
492      return 1
493   }
494   # String => '\$[0-9a-fA-F]{1,4}'
495   # attribute => 'Number'
496   # context => '#stay'
497   # type => 'RegExpr'
498   if ($self->testRegExpr($text, '\\$[0-9a-fA-F]{1,4}', 0, 0, 0, undef, 0, '#stay', 'Number')) {
499      return 1
500   }
501   # String => '[a-zA-Z_]+\w*'
502   # attribute => 'Normal Text'
503   # context => '#stay'
504   # type => 'RegExpr'
505   if ($self->testRegExpr($text, '[a-zA-Z_]+\\w*', 0, 0, 0, undef, 0, '#stay', 'Normal Text')) {
506      return 1
507   }
508   # String => '\d+'
509   # attribute => 'Number'
510   # context => '#stay'
511   # type => 'RegExpr'
512   if ($self->testRegExpr($text, '\\d+', 0, 0, 0, undef, 0, '#stay', 'Number')) {
513      return 1
514   }
515   # attribute => 'Keyword'
516   # beginRegion => 'reg_compound'
517   # char => '{'
518   # context => '#stay'
519   # type => 'DetectChar'
520   if ($self->testDetectChar($text, '{', 0, 0, 0, undef, 0, '#stay', 'Keyword')) {
521      return 1
522   }
523   # attribute => 'Keyword'
524   # char => '}'
525   # context => '#stay'
526   # endRegion => 'reg_compound'
527   # type => 'DetectChar'
528   if ($self->testDetectChar($text, '}', 0, 0, 0, undef, 0, '#stay', 'Keyword')) {
529      return 1
530   }
531   # String => '%&()+-<=>{|}~'
532   # attribute => 'Operator'
533   # context => '#stay'
534   # type => 'AnyChar'
535   if ($self->testAnyChar($text, '%&()+-<=>{|}~', 0, 0, undef, 0, '#stay', 'Operator')) {
536      return 1
537   }
538   return 0;
539};
540
541sub parsePropDefValrules {
542   my ($self, $text) = @_;
543   # attribute => 'Comment'
544   # char => '!'
545   # context => 'comment'
546   # type => 'DetectChar'
547   if ($self->testDetectChar($text, '!', 0, 0, 0, undef, 0, 'comment', 'Comment')) {
548      return 1
549   }
550   # attribute => 'String'
551   # char => '"'
552   # context => 'string'
553   # type => 'DetectChar'
554   if ($self->testDetectChar($text, '"', 0, 0, 0, undef, 0, 'string', 'String')) {
555      return 1
556   }
557   # attribute => 'Word'
558   # char => '''
559   # context => 'word'
560   # type => 'DetectChar'
561   if ($self->testDetectChar($text, '\'', 0, 0, 0, undef, 0, 'word', 'Word')) {
562      return 1
563   }
564   # attribute => 'Function'
565   # beginRegion => 'reg_prop_def_func'
566   # char => '['
567   # context => 'prop_func_def'
568   # type => 'DetectChar'
569   if ($self->testDetectChar($text, '[', 0, 0, 0, undef, 0, 'prop_func_def', 'Function')) {
570      return 1
571   }
572   # attribute => 'Operator'
573   # char => ','
574   # context => '#pop'
575   # type => 'DetectChar'
576   if ($self->testDetectChar($text, ',', 0, 0, 0, undef, 0, '#pop', 'Operator')) {
577      return 1
578   }
579   # String => '\$[0-9a-fA-F]{1,4}'
580   # attribute => 'Number'
581   # context => '#stay'
582   # type => 'RegExpr'
583   if ($self->testRegExpr($text, '\\$[0-9a-fA-F]{1,4}', 0, 0, 0, undef, 0, '#stay', 'Number')) {
584      return 1
585   }
586   # String => '\d+'
587   # attribute => 'Number'
588   # context => '#stay'
589   # type => 'RegExpr'
590   if ($self->testRegExpr($text, '\\d+', 0, 0, 0, undef, 0, '#stay', 'Number')) {
591      return 1
592   }
593   return 0;
594};
595
596sub parseTopLevel {
597   my ($self, $text) = @_;
598   # attribute => 'Comment'
599   # char => '!'
600   # context => 'comment'
601   # type => 'DetectChar'
602   if ($self->testDetectChar($text, '!', 0, 0, 0, undef, 0, 'comment', 'Comment')) {
603      return 1
604   }
605   # attribute => 'String'
606   # char => '"'
607   # context => 'string'
608   # type => 'DetectChar'
609   if ($self->testDetectChar($text, '"', 0, 0, 0, undef, 0, 'string', 'String')) {
610      return 1
611   }
612   # String => '[[]\s*[a-zA-Z_]+\w*'
613   # attribute => 'Function'
614   # beginRegion => 'reg_function'
615   # context => 'funcdef'
616   # type => 'RegExpr'
617   if ($self->testRegExpr($text, '[[]\\s*[a-zA-Z_]+\\w*', 0, 0, 0, undef, 0, 'funcdef', 'Function')) {
618      return 1
619   }
620   # String => ' *object | *class '
621   # attribute => 'Pragma'
622   # beginRegion => 'reg_class'
623   # column => '0'
624   # context => 'ClassDecl'
625   # insensitive => 'TRUE'
626   # type => 'RegExpr'
627   if ($self->testRegExpr($text, ' *object | *class ', 1, 0, 0, 0, 0, 'ClassDecl', 'Pragma')) {
628      return 1
629   }
630   # String => 'pragmas'
631   # attribute => 'Pragma'
632   # context => '#stay'
633   # type => 'keyword'
634   if ($self->testKeyword($text, 'pragmas', 0, undef, 0, '#stay', 'Pragma')) {
635      return 1
636   }
637   # String => 'inline_pragmas'
638   # attribute => 'Pragma'
639   # context => '#stay'
640   # type => 'keyword'
641   if ($self->testKeyword($text, 'inline_pragmas', 0, undef, 0, '#stay', 'Pragma')) {
642      return 1
643   }
644   # String => '--?>'
645   # attribute => 'Operator'
646   # context => '#stay'
647   # type => 'RegExpr'
648   if ($self->testRegExpr($text, '--?>', 0, 0, 0, undef, 0, '#stay', 'Operator')) {
649      return 1
650   }
651   # String => '[a-zA-Z_]+\d*'
652   # attribute => 'Normal Text'
653   # context => '#stay'
654   # type => 'RegExpr'
655   if ($self->testRegExpr($text, '[a-zA-Z_]+\\d*', 0, 0, 0, undef, 0, '#stay', 'Normal Text')) {
656      return 1
657   }
658   # String => '\$[0-9a-fA-F]{1,4}'
659   # attribute => 'Number'
660   # context => '#stay'
661   # type => 'RegExpr'
662   if ($self->testRegExpr($text, '\\$[0-9a-fA-F]{1,4}', 0, 0, 0, undef, 0, '#stay', 'Number')) {
663      return 1
664   }
665   # String => '\d+'
666   # attribute => 'Number'
667   # context => '#stay'
668   # type => 'RegExpr'
669   if ($self->testRegExpr($text, '\\d+', 0, 0, 0, undef, 0, '#stay', 'Number')) {
670      return 1
671   }
672   return 0;
673};
674
675sub parsecomment {
676   my ($self, $text) = @_;
677   return 0;
678};
679
680sub parsefuncdef {
681   my ($self, $text) = @_;
682   # context => 'Normal'
683   # type => 'IncludeRules'
684   if ($self->includeRules('Normal', $text)) {
685      return 1
686   }
687   # attribute => 'Function'
688   # char => ']'
689   # char1 => ';'
690   # context => '#pop'
691   # endRegion => 'reg_function'
692   # type => 'Detect2Chars'
693   if ($self->testDetect2Chars($text, ']', ';', 0, 0, 0, undef, 0, '#pop', 'Function')) {
694      return 1
695   }
696   return 0;
697};
698
699sub parsehas_decl {
700   my ($self, $text) = @_;
701   # attribute => 'Pragma'
702   # char => ';'
703   # context => '#pop#pop#pop'
704   # endRegion => 'reg_class'
705   # type => 'DetectChar'
706   if ($self->testDetectChar($text, ';', 0, 0, 0, undef, 0, '#pop#pop#pop', 'Pragma')) {
707      return 1
708   }
709   # context => 'PropDefVal rules'
710   # type => 'IncludeRules'
711   if ($self->includeRules('PropDefVal rules', $text)) {
712      return 1
713   }
714   return 0;
715};
716
717sub parseprop_def {
718   my ($self, $text) = @_;
719   # attribute => 'Function'
720   # char => ','
721   # context => '#pop'
722   # endRegion => 'reg_prop'
723   # type => 'DetectChar'
724   if ($self->testDetectChar($text, ',', 0, 0, 0, undef, 0, '#pop', 'Function')) {
725      return 1
726   }
727   # attribute => 'Pragma'
728   # char => ';'
729   # context => '#pop#pop#pop'
730   # endRegion => 'reg_class'
731   # type => 'DetectChar'
732   if ($self->testDetectChar($text, ';', 0, 0, 0, undef, 0, '#pop#pop#pop', 'Pragma')) {
733      return 1
734   }
735   # attribute => 'Function'
736   # beginRegion => 'reg_prop_func'
737   # char => '['
738   # context => 'prop_func_def'
739   # type => 'DetectChar'
740   if ($self->testDetectChar($text, '[', 0, 0, 0, undef, 0, 'prop_func_def', 'Function')) {
741      return 1
742   }
743   # context => 'PropDefVal rules'
744   # type => 'IncludeRules'
745   if ($self->includeRules('PropDefVal rules', $text)) {
746      return 1
747   }
748   return 0;
749};
750
751sub parseprop_func_def {
752   my ($self, $text) = @_;
753   # attribute => 'Function'
754   # char => ']'
755   # context => '#pop'
756   # endRegion => 'reg_prop_func'
757   # type => 'DetectChar'
758   if ($self->testDetectChar($text, ']', 0, 0, 0, undef, 0, '#pop', 'Function')) {
759      return 1
760   }
761   # context => 'Normal'
762   # type => 'IncludeRules'
763   if ($self->includeRules('Normal', $text)) {
764      return 1
765   }
766   return 0;
767};
768
769sub parsestring {
770   my ($self, $text) = @_;
771   # attribute => 'String'
772   # char => '"'
773   # context => '#pop'
774   # type => 'DetectChar'
775   if ($self->testDetectChar($text, '"', 0, 0, 0, undef, 0, '#pop', 'String')) {
776      return 1
777   }
778   return 0;
779};
780
781sub parseword {
782   my ($self, $text) = @_;
783   # attribute => 'Word'
784   # char => '''
785   # context => '#pop'
786   # type => 'DetectChar'
787   if ($self->testDetectChar($text, '\'', 0, 0, 0, undef, 0, '#pop', 'Word')) {
788      return 1
789   }
790   return 0;
791};
792
793
7941;
795
796__END__
797
798=head1 NAME
799
800Syntax::Highlight::Engine::Kate::Inform - a Plugin for Inform syntax highlighting
801
802=head1 SYNOPSIS
803
804 require Syntax::Highlight::Engine::Kate::Inform;
805 my $sh = new Syntax::Highlight::Engine::Kate::Inform([
806 ]);
807
808=head1 DESCRIPTION
809
810Syntax::Highlight::Engine::Kate::Inform is a  plugin module that provides syntax highlighting
811for Inform to the Syntax::Haghlight::Engine::Kate highlighting engine.
812
813This code is generated from the syntax definition files used
814by the Kate project.
815It works quite fine, but can use refinement and optimization.
816
817It inherits Syntax::Higlight::Engine::Kate::Template. See also there.
818
819=head1 AUTHOR
820
821Hans Jeuken (haje <at> toneel <dot> demon <dot> nl)
822
823=head1 BUGS
824
825Unknown. If you find any, please contact the author