summaryrefslogtreecommitdiff
path: root/IkiWiki
diff options
context:
space:
mode:
authorDavid Bremner <bremner@unb.ca>2010-12-29 07:18:14 -0400
committerJoey Hess <joey@kitenet.net>2010-12-29 13:05:20 -0400
commitab511bb39c4cde35137b7ce3a2fe34fe720259a5 (patch)
tree4c8790702de8f9361b6a4bec5d142f0606917d52 /IkiWiki
parent83b685abb51cc904ae6fb4c8d3f5548823307c0b (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')
-rw-r--r--IkiWiki/Plugin/highlight.pm51
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;
}