# Copyright (c) 2006 Hans Jeuken. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
package Syntax::Highlight::Engine::Kate;
use vars qw($VERSION);
$VERSION = '0.04';
use strict;
use warnings;
use Carp;
use Data::Dumper;
use File::Basename;
use base('Syntax::Highlight::Engine::Kate::Template');
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my %args = (@_);
my $add = delete $args{'plugins'};
unless (defined($add)) { $add = [] };
my $language = delete $args{'language'};
unless (defined($language)) { $language = 'Off' };
my $self = $class->SUPER::new(%args);
$self->{'plugins'} = {};
#begin autoinsert
$self->{'extensions'} = {
' *.cls' => ['LaTeX', ],
' *.dtx' => ['LaTeX', ],
' *.ltx' => ['LaTeX', ],
' *.sty' => ['LaTeX', ],
'*.4GL' => ['4GL', ],
'*.4gl' => ['4GL', ],
'*.ABC' => ['ABC', ],
'*.ASM' => ['AVR Assembler', 'PicAsm', ],
'*.BAS' => ['FreeBASIC', ],
'*.BI' => ['FreeBASIC', ],
'*.C' => ['C++', 'C', 'ANSI C89', ],
'*.D' => ['D', ],
'*.F' => ['Fortran', ],
'*.F90' => ['Fortran', ],
'*.F95' => ['Fortran', ],
'*.FOR' => ['Fortran', ],
'*.FPP' => ['Fortran', ],
'*.GDL' => ['GDL', ],
'*.H' => ['C++', ],
'*.JSP' => ['JSP', ],
'*.LOGO' => ['de_DE', 'en_US', 'nl', ],
'*.LY' => ['LilyPond', ],
'*.Logo' => ['de_DE', 'en_US', 'nl', ],
'*.M' => ['Matlab', 'Octave', ],
'*.MAB' => ['MAB-DB', ],
'*.Mab' => ['MAB-DB', ],
'*.PER' => ['4GL-PER', ],
'*.PIC' => ['PicAsm', ],
'*.PRG' => ['xHarbour', 'Clipper', ],
'*.R' => ['R Script', ],
'*.S' => ['GNU Assembler', ],
'*.SQL' => ['SQL', 'SQL (MySQL)', 'SQL (PostgreSQL)', ],
'*.SRC' => ['PicAsm', ],
'*.V' => ['Verilog', ],
'*.VCG' => ['GDL', ],
'*.a' => ['Ada', ],
'*.abc' => ['ABC', ],
'*.ada' => ['Ada', ],
'*.adb' => ['Ada', ],
'*.ado' => ['Stata', ],
'*.ads' => ['Ada', ],
'*.ahdl' => ['AHDL', ],
'*.ai' => ['PostScript', ],
'*.ans' => ['Ansys', ],
'*.asm' => ['AVR Assembler', 'Asm6502', 'Intel x86 (NASM)', 'PicAsm', ],
'*.asm-avr' => ['AVR Assembler', ],
'*.asp' => ['ASP', ],
'*.awk' => ['AWK', ],
'*.bas' => ['FreeBASIC', ],
'*.basetest' => ['BaseTest', ],
'*.bash' => ['Bash', ],
'*.bi' => ['FreeBASIC', ],
'*.bib' => ['BibTeX', ],
'*.bro' => ['Component-Pascal', ],
'*.c' => ['C', 'ANSI C89', 'LPC', ],
'*.c++' => ['C++', ],
'*.cc' => ['C++', ],
'*.cfc' => ['ColdFusion', ],
'*.cfg' => ['Quake Script', ],
'*.cfm' => ['ColdFusion', ],
'*.cfml' => ['ColdFusion', ],
'*.cg' => ['Cg', ],
'*.cgis' => ['CGiS', ],
'*.ch' => ['xHarbour', 'Clipper', ],
'*.cis' => ['Cisco', ],
'*.cl' => ['Common Lisp', ],
'*.cmake' => ['CMake', ],
'*.config' => ['Logtalk', ],
'*.cp' => ['Component-Pascal', ],
'*.cpp' => ['C++', ],
'*.cs' => ['C#', ],
'*.css' => ['CSS', ],
'*.cue' => ['CUE Sheet', ],
'*.cxx' => ['C++', ],
'*.d' => ['D', ],
'*.daml' => ['XML', ],
'*.dbm' => ['ColdFusion', ],
'*.def' => ['Modula-2', ],
'*.desktop' => ['.desktop', ],
'*.diff' => ['Diff', ],
'*.do' => ['Stata', ],
'*.docbook' => ['XML', ],
'*.dox' => ['Doxygen', ],
'*.doxygen' => ['Doxygen', ],
'*.e' => ['E Language', 'Eiffel', 'Euphoria', ],
'*.ebuild' => ['Bash', ],
'*.eclass' => ['Bash', ],
'*.eml' => ['Email', ],
'*.eps' => ['PostScript', ],
'*.err' => ['4GL', ],
'*.ex' => ['Euphoria', ],
'*.exu' => ['Euphoria', ],
'*.exw' => ['Euphoria', ],
'*.f' => ['Fortran', ],
'*.f90' => ['Fortran', ],
'*.f95' => ['Fortran', ],
'*.fe' => ['ferite', ],
'*.feh' => ['ferite', ],
'*.flex' => ['Lex/Flex', ],
'*.for' => ['Fortran', ],
'*.fpp' => ['Fortran', ],
'*.frag' => ['GLSL', ],
'*.gdl' => ['GDL', ],
'*.glsl' => ['GLSL', ],
'*.guile' => ['Scheme', ],
'*.h' => ['C++', 'C', 'ANSI C89', 'Inform', 'LPC', 'Objective-C', ],
'*.h++' => ['C++', ],
'*.hcc' => ['C++', ],
'*.hpp' => ['C++', ],
'*.hs' => ['Haskell', ],
'*.hsp' => ['Spice', ],
'*.ht' => ['Apache Configuration', ],
'*.htm' => ['HTML', ],
'*.html' => ['HTML', 'Mason', ],
'*.hxx' => ['C++', ],
'*.i' => ['progress', ],
'*.idl' => ['IDL', ],
'*.inc' => ['POV-Ray', 'PHP (HTML)', 'LPC', ],
'*.inf' => ['Inform', ],
'*.ini' => ['INI Files', ],
'*.java' => ['Java', ],
'*.js' => ['JavaScript', ],
'*.jsp' => ['JSP', ],
'*.katetemplate' => ['Kate File Template', ],
'*.kbasic' => ['KBasic', ],
'*.kdelnk' => ['.desktop', ],
'*.l' => ['Lex/Flex', ],
'*.ldif' => ['LDIF', ],
'*.lex' => ['Lex/Flex', ],
'*.lgo' => ['de_DE', 'en_US', 'nl', ],
'*.lgt' => ['Logtalk', ],
'*.lhs' => ['Literate Haskell', ],
'*.lisp' => ['Common Lisp', ],
'*.logo' => ['de_DE', 'en_US', 'nl', ],
'*.lsp' => ['Common Lisp', ],
'*.lua' => ['Lua', ],
'*.ly' => ['LilyPond', ],
'*.m' => ['Matlab', 'Objective-C', 'Octave', ],
'*.m3u' => ['M3U', ],
'*.mab' => ['MAB-DB', ],
'*.md' => ['Modula-2', ],
'*.mi' => ['Modula-2', ],
'*.ml' => ['Objective Caml', 'SML', ],
'*.mli' => ['Objective Caml', ],
'*.moc' => ['C++', ],
'*.mod' => ['Modula-2', ],
'*.mup' => ['Music Publisher', ],
'*.not' => ['Music Publisher', ],
'*.o' => ['LPC', ],
'*.octave' => ['Octave', ],
'*.p' => ['Pascal', 'progress', ],
'*.pas' => ['Pascal', ],
'*.pb' => ['PureBasic', ],
'*.per' => ['4GL-PER', ],
'*.per.err' => ['4GL-PER', ],
'*.php' => ['PHP (HTML)', ],
'*.php3' => ['PHP (HTML)', ],
'*.phtm' => ['PHP (HTML)', ],
'*.phtml' => ['PHP (HTML)', ],
'*.pic' => ['PicAsm', ],
'*.pike' => ['Pike', ],
'*.pl' => ['Perl', ],
'*.pls' => ['INI Files', ],
'*.pm' => ['Perl', ],
'*.po' => ['GNU Gettext', ],
'*.pot' => ['GNU Gettext', ],
'*.pov' => ['POV-Ray', ],
'*.pp' => ['Pascal', ],
'*.prg' => ['xHarbour', 'Clipper', ],
'*.pro' => ['RSI IDL', ],
'*.prolog' => ['Prolog', ],
'*.ps' => ['PostScript', ],
'*.py' => ['Python', ],
'*.pyw' => ['Python', ],
'*.rb' => ['Ruby', ],
'*.rc' => ['XML', ],
'*.rdf' => ['XML', ],
'*.reg' => ['WINE Config', ],
'*.rex' => ['REXX', ],
'*.rib' => ['RenderMan RIB', ],
'*.s' => ['GNU Assembler', 'MIPS Assembler', ],
'*.sa' => ['Sather', ],
'*.sce' => ['scilab', ],
'*.scheme' => ['Scheme', ],
'*.sci' => ['scilab', ],
'*.scm' => ['Scheme', ],
'*.sgml' => ['SGML', ],
'*.sh' => ['Bash', ],
'*.shtm' => ['HTML', ],
'*.shtml' => ['HTML', ],
'*.siv' => ['Sieve', ],
'*.sml' => ['SML', ],
'*.sp' => ['Spice', ],
'*.spec' => ['RPM Spec', ],
'*.sql' => ['SQL', 'SQL (MySQL)', 'SQL (PostgreSQL)', ],
'*.src' => ['PicAsm', ],
'*.ss' => ['Scheme', ],
'*.t2t' => ['txt2tags', ],
'*.tcl' => ['Tcl/Tk', ],
'*.tdf' => ['AHDL', ],
'*.tex' => ['LaTeX', ],
'*.tji' => ['TaskJuggler', ],
'*.tjp' => ['TaskJuggler', ],
'*.tk' => ['Tcl/Tk', ],
'*.tst' => ['BaseTestchild', ],
'*.uc' => ['UnrealScript', ],
'*.v' => ['Verilog', ],
'*.vcg' => ['GDL', ],
'*.vert' => ['GLSL', ],
'*.vhd' => ['VHDL', ],
'*.vhdl' => ['VHDL', ],
'*.vl' => ['Verilog', ],
'*.vm' => ['Velocity', ],
'*.w' => ['progress', ],
'*.wml' => ['PHP (HTML)', ],
'*.wrl' => ['VRML', ],
'*.xml' => ['XML', ],
'*.xsl' => ['xslt', ],
'*.xslt' => ['xslt', ],
'*.y' => ['Yacc/Bison', ],
'*.ys' => ['yacas', ],
'*Makefile*' => ['Makefile', ],
'*makefile*' => ['Makefile', ],
'*patch' => ['Diff', ],
'CMakeLists.txt' => ['CMake', ],
'ChangeLog' => ['ChangeLog', ],
'QRPGLESRC.*' => ['ILERPG', ],
'apache.conf' => ['Apache Configuration', ],
'apache2.conf' => ['Apache Configuration', ],
'httpd.conf' => ['Apache Configuration', ],
'httpd2.conf' => ['Apache Configuration', ],
'xorg.conf' => ['x.org Configuration', ],
};
$self->{'sections'} = {
'Assembler' => [
'AVR Assembler',
'Asm6502',
'GNU Assembler',
'Intel x86 (NASM)',
'MIPS Assembler',
'PicAsm',
],
'Configuration' => [
'.desktop',
'Apache Configuration',
'Cisco',
'INI Files',
'WINE Config',
'x.org Configuration',
],
'Database' => [
'4GL',
'4GL-PER',
'LDIF',
'SQL',
'SQL (MySQL)',
'SQL (PostgreSQL)',
'progress',
],
'Hardware' => [
'AHDL',
'Spice',
'VHDL',
'Verilog',
],
'Logo' => [
'de_DE',
'en_US',
'nl',
],
'Markup' => [
'ASP',
'BibTeX',
'CSS',
'ColdFusion',
'Doxygen',
'GNU Gettext',
'HTML',
'JSP',
'Javadoc',
'Kate File Template',
'LaTeX',
'MAB-DB',
'PostScript',
'SGML',
'VRML',
'Wikimedia',
'XML',
'txt2tags',
'xslt',
],
'Other' => [
'ABC',
'Alerts',
'CMake',
'CSS/PHP',
'CUE Sheet',
'ChangeLog',
'Debian Changelog',
'Debian Control',
'Diff',
'Email',
'JavaScript/PHP',
'LilyPond',
'M3U',
'Makefile',
'Music Publisher',
'POV-Ray',
'RPM Spec',
'RenderMan RIB',
],
'Scientific' => [
'GDL',
'Matlab',
'Octave',
'TI Basic',
'scilab',
],
'Script' => [
'Ansys',
],
'Scripts' => [
'AWK',
'Bash',
'Common Lisp',
'Euphoria',
'JavaScript',
'Lua',
'Mason',
'PHP (HTML)',
'PHP/PHP',
'Perl',
'Pike',
'Python',
'Quake Script',
'R Script',
'REXX',
'Ruby',
'Scheme',
'Sieve',
'TaskJuggler',
'Tcl/Tk',
'UnrealScript',
'Velocity',
'ferite',
],
'Sources' => [
'ANSI C89',
'Ada',
'C',
'C#',
'C++',
'CGiS',
'Cg',
'Clipper',
'Component-Pascal',
'D',
'E Language',
'Eiffel',
'Fortran',
'FreeBASIC',
'GLSL',
'Haskell',
'IDL',
'ILERPG',
'Inform',
'Java',
'KBasic',
'LPC',
'Lex/Flex',
'Literate Haskell',
'Logtalk',
'Modula-2',
'Objective Caml',
'Objective-C',
'Pascal',
'Prolog',
'PureBasic',
'RSI IDL',
'SML',
'Sather',
'Stata',
'Yacc/Bison',
'xHarbour',
'yacas',
],
'Test' => [
'BaseTest',
'BaseTestchild',
],
};
$self->{'syntaxes'} = {
'.desktop' => 'Desktop',
'4GL' => 'FourGL',
'4GL-PER' => 'FourGLminusPER',
'ABC' => 'ABC',
'AHDL' => 'AHDL',
'ANSI C89' => 'ANSI_C89',
'ASP' => 'ASP',
'AVR Assembler' => 'AVR_Assembler',
'AWK' => 'AWK',
'Ada' => 'Ada',
'Alerts' => 'Alerts',
'Ansys' => 'Ansys',
'Apache Configuration' => 'Apache_Configuration',
'Asm6502' => 'Asm6502',
'BaseTest' => 'BaseTest',
'BaseTestchild' => 'BaseTestchild',
'Bash' => 'Bash',
'BibTeX' => 'BibTeX',
'C' => 'C',
'C#' => 'Cdash',
'C++' => 'Cplusplus',
'CGiS' => 'CGiS',
'CMake' => 'CMake',
'CSS' => 'CSS',
'CSS/PHP' => 'CSS_PHP',
'CUE Sheet' => 'CUE_Sheet',
'Cg' => 'Cg',
'ChangeLog' => 'ChangeLog',
'Cisco' => 'Cisco',
'Clipper' => 'Clipper',
'ColdFusion' => 'ColdFusion',
'Common Lisp' => 'Common_Lisp',
'Component-Pascal' => 'ComponentminusPascal',
'D' => 'D',
'Debian Changelog' => 'Debian_Changelog',
'Debian Control' => 'Debian_Control',
'Diff' => 'Diff',
'Doxygen' => 'Doxygen',
'E Language' => 'E_Language',
'Eiffel' => 'Eiffel',
'Email' => 'Email',
'Euphoria' => 'Euphoria',
'Fortran' => 'Fortran',
'FreeBASIC' => 'FreeBASIC',
'GDL' => 'GDL',
'GLSL' => 'GLSL',
'GNU Assembler' => 'GNU_Assembler',
'GNU Gettext' => 'GNU_Gettext',
'HTML' => 'HTML',
'Haskell' => 'Haskell',
'IDL' => 'IDL',
'ILERPG' => 'ILERPG',
'INI Files' => 'INI_Files',
'Inform' => 'Inform',
'Intel x86 (NASM)' => 'Intel_x86_NASM',
'JSP' => 'JSP',
'Java' => 'Java',
'JavaScript' => 'JavaScript',
'JavaScript/PHP' => 'JavaScript_PHP',
'Javadoc' => 'Javadoc',
'KBasic' => 'KBasic',
'Kate File Template' => 'Kate_File_Template',
'LDIF' => 'LDIF',
'LPC' => 'LPC',
'LaTeX' => 'LaTeX',
'Lex/Flex' => 'Lex_Flex',
'LilyPond' => 'LilyPond',
'Literate Haskell' => 'Literate_Haskell',
'Logtalk' => 'Logtalk',
'Lua' => 'Lua',
'M3U' => 'M3U',
'MAB-DB' => 'MABminusDB',
'MIPS Assembler' => 'MIPS_Assembler',
'Makefile' => 'Makefile',
'Mason' => 'Mason',
'Matlab' => 'Matlab',
'Modula-2' => 'Modulaminus2',
'Music Publisher' => 'Music_Publisher',
'Objective Caml' => 'Objective_Caml',
'Objective-C' => 'ObjectiveminusC',
'Octave' => 'Octave',
'PHP (HTML)' => 'PHP_HTML',
'PHP/PHP' => 'PHP_PHP',
'POV-Ray' => 'POVminusRay',
'Pascal' => 'Pascal',
'Perl' => 'Perl',
'PicAsm' => 'PicAsm',
'Pike' => 'Pike',
'PostScript' => 'PostScript',
'Prolog' => 'Prolog',
'PureBasic' => 'PureBasic',
'Python' => 'Python',
'Quake Script' => 'Quake_Script',
'R Script' => 'R_Script',
'REXX' => 'REXX',
'RPM Spec' => 'RPM_Spec',
'RSI IDL' => 'RSI_IDL',
'RenderMan RIB' => 'RenderMan_RIB',
'Ruby' => 'Ruby',
'SGML' => 'SGML',
'SML' => 'SML',
'SQL' => 'SQL',
'SQL (MySQL)' => 'SQL_MySQL',
'SQL (PostgreSQL)' => 'SQL_PostgreSQL',
'Sather' => 'Sather',
'Scheme' => 'Scheme',
'Sieve' => 'Sieve',
'Spice' => 'Spice',
'Stata' => 'Stata',
'TI Basic' => 'TI_Basic',
'TaskJuggler' => 'TaskJuggler',
'Tcl/Tk' => 'Tcl_Tk',
'UnrealScript' => 'UnrealScript',
'VHDL' => 'VHDL',
'VRML' => 'VRML',
'Velocity' => 'Velocity',
'Verilog' => 'Verilog',
'WINE Config' => 'WINE_Config',
'Wikimedia' => 'Wikimedia',
'XML' => 'XML',
'Yacc/Bison' => 'Yacc_Bison',
'de_DE' => 'De_DE',
'en_US' => 'En_US',
'ferite' => 'Ferite',
'nl' => 'Nl',
'progress' => 'Progress',
'scilab' => 'Scilab',
'txt2tags' => 'Txt2tags',
'x.org Configuration' => 'Xorg_Configuration',
'xHarbour' => 'XHarbour',
'xslt' => 'Xslt',
'yacas' => 'Yacas',
};
#end autoinsert
$self->{'language '} = '';
bless ($self, $class);
if ($language ne '') {
$self->language($language);
}
return $self;
}
sub extensions {
my $self = shift;
return $self->{'extensions'};
}
#overriding Template's initialize method. now it should not do anything.
sub initialize {
my $cw = shift;
}
sub language {
my $self = shift;
if (@_) {
$self->{'language'} = shift;
$self->reset;
}
return $self->{'language'};
}
sub languageAutoSet {
my ($self, $file) = @_;
my $lang = $self->languagePropose($file);
if (defined $lang) {
$self->language($lang)
} else {
$self->language('Off')
}
}
sub languageList {
my $self = shift;
my $l = $self->{'syntaxes'};
return sort {uc($a) cmp uc($b)} keys %$l;
}
sub languagePropose {
my ($self, $file) = @_;
my $hsh = $self->extensions;
foreach my $key (keys %$hsh) {
my $reg = $key;
$reg =~ s/\./\\./g;
$reg =~ s/\+/\\+/g;
$reg =~ s/\*/.*/g;
$reg = "$reg\$";
if ($file =~ /$reg/) {
return $hsh->{$key}->[0]
}
}
return undef;
}
sub languagePlug {
my ($self, $req) = @_;
unless (exists($self->{'syntaxes'}->{$req})) {
warn "undefined language: $req";
return undef;
}
return $self->{'syntaxes'}->{$req};
}
sub reset {
my $self = shift;
my $lang = $self->language;
if ($lang eq 'Off') {
$self->stack([]);
} else {
my $plug = $self->pluginGet($lang);
my $basecontext = $plug->basecontext;
$self->stack([
[$plug, $basecontext]
]);
}
$self->out([]);
$self->snippet('');
}
sub sections {
my $self = shift;
return $self->{'sections'};
}
sub syntaxes {
my $self = shift;
return $self->{'syntaxes'}
}
1;
__END__