From ab511bb39c4cde35137b7ce3a2fe34fe720259a5 Mon Sep 17 00:00:00 2001 From: David Bremner Date: Wed, 29 Dec 2010 07:18:14 -0400 Subject: [PATCH] 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. --- IkiWiki/Plugin/highlight.pm | 51 +++++++++++++++++++++++++++++++------ 1 file 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
-		$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;
 	}
-- 
2.39.5