diff options
author | David Bremner <bremner@unb.ca> | 2010-12-29 07:18:14 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2010-12-29 13:05:20 -0400 |
commit | ab511bb39c4cde35137b7ce3a2fe34fe720259a5 (patch) | |
tree | 4c8790702de8f9361b6a4bec5d142f0606917d52 /IkiWiki/Plugin | |
parent | 83b685abb51cc904ae6fb4c8d3f5548823307c0b (diff) |
Update highlight plugin for highlight api.
Note that in particular calling initTheme with and empty file does not
work anymore.
use of initLanguage was replaced by loadLanguage, which seems to work
in both places.
I tried to make it a bit more robust against missing a highlight package.
There are lots of warnings, but it no longer crashes.
Diffstat (limited to 'IkiWiki/Plugin')
-rw-r--r-- | IkiWiki/Plugin/highlight.pm | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/IkiWiki/Plugin/highlight.pm b/IkiWiki/Plugin/highlight.pm index 9d05e9fcf..65e372db1 100644 --- a/IkiWiki/Plugin/highlight.pm +++ b/IkiWiki/Plugin/highlight.pm @@ -1,11 +1,17 @@ #!/usr/bin/perl package IkiWiki::Plugin::highlight; +# This has been tested with highlight 2.16 and highlight 3.2+svn19. +# In particular version 3.2 won't work. It detects the different +# versions by the presence of the the highlight::DataDir class. + use warnings; use strict; use IkiWiki 3.00; use Encode; +my $data_dir; + sub import { hook(type => "getsetup", id => "highlight", call => \&getsetup); hook(type => "checkconfig", id => "highlight", call => \&checkconfig); @@ -45,13 +51,31 @@ sub getsetup () { } sub checkconfig () { + + eval q{use highlight}; + if ($@) { + print STDERR "Failed to load highlight. Configuring anyway.\n"; + }; + + if (highlight::DataDir->can('new')){ + $data_dir=new highlight::DataDir(); + $data_dir->searchDataDir(""); + } else { + $data_dir=undef; + } + if (! exists $config{filetypes_conf}) { - $config{filetypes_conf}="/etc/highlight/filetypes.conf"; + $config{filetypes_conf}= + ($data_dir ? $data_dir->getConfDir() : "/etc/highlight/") + . "filetypes.conf"; } if (! exists $config{langdefdir}) { - $config{langdefdir}="/usr/share/highlight/langDefs"; + $config{langdefdir}= + ($data_dir ? $data_dir->getLangPath("") + : "/usr/share/highlight/langDefs"); + } - if (exists $config{tohighlight}) { + if (exists $config{tohighlight} && read_filetypes()) { foreach my $file (split ' ', $config{tohighlight}) { my @opts = $file=~s/^\.// ? (keepextension => 1) : @@ -96,7 +120,12 @@ my %highlighters; # Parse highlight's config file to get extension => language mappings. sub read_filetypes () { - open (my $f, $config{filetypes_conf}) || error("$config{filetypes_conf}: $!"); + my $f; + if (!open($f, $config{filetypes_conf})) { + warn($config{filetypes_conf}.": ".$!); + return 0; + }; + local $/=undef; my $config=<$f>; close $f; @@ -119,7 +148,7 @@ sub read_filetypes () { } } - $filetypes_read=1; + return $filetypes_read=1; } @@ -158,11 +187,17 @@ sub highlight ($$) { my $gen; if (! exists $highlighters{$langfile}) { - $gen = highlightc::CodeGenerator_getInstance($highlightc::XHTML); + $gen = highlight::CodeGenerator::getInstance($highlight::XHTML); $gen->setFragmentCode(1); # generate html fragment $gen->setHTMLEnclosePreTag(1); # include stylish <pre> - $gen->initTheme("/dev/null"); # theme is not needed because CSS is not emitted - $gen->initLanguage($langfile); # must come after initTheme + if ($data_dir){ + # new style, requires a real theme, but has no effect + $gen->initTheme($data_dir->getThemePath("seashell.theme")); + } else { + # old style, anything works. + $gen->initTheme("/dev/null"); + } + $gen->loadLanguage($langfile); # must come after initTheme $gen->setEncoding("utf-8"); $highlighters{$langfile}=$gen; } |