aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@gnu.kitenet.net>2009-05-23 18:39:49 -0400
committerJoey Hess <joey@gnu.kitenet.net>2009-05-23 18:39:49 -0400
commit39e5e250006421535c13b97e9ca28600c8447877 (patch)
treefcaad44bc96a42702cda726f88f5c4e3541b9801
parent8ba98ad1dcbffe32150745c98d72512a6fa6149e (diff)
downloadikiwiki-39e5e250006421535c13b97e9ca28600c8447877.tar
ikiwiki-39e5e250006421535c13b97e9ca28600c8447877.tar.gz
cache highlighters to optimise
Setting up a new highlighter object is slightly expensive since it reads and parses the langfile each time. So cache them. This also speeds up ext2langfile by avoiding it needing to check for the existence of a language file in some cases.
-rw-r--r--IkiWiki/Plugin/highlight.pm36
1 files changed, 21 insertions, 15 deletions
diff --git a/IkiWiki/Plugin/highlight.pm b/IkiWiki/Plugin/highlight.pm
index 90e7053d9..4c02f6c23 100644
--- a/IkiWiki/Plugin/highlight.pm
+++ b/IkiWiki/Plugin/highlight.pm
@@ -74,6 +74,7 @@ sub htmlizefallback {
my %ext2lang;
my $filetypes_read=0;
+my %highlighters;
# Parse highlight's config file to get extension => language mappings.
sub read_filetypes () {
@@ -88,23 +89,23 @@ sub read_filetypes () {
$filetypes_read=1;
}
-sub langfile ($) {
- return "$langdefdir/$_[0].lang";
-}
# Given a filename extension, determines the language definition to
# use to highlight it.
sub ext2langfile ($) {
my $ext=shift;
+ my $langfile="$langdefdir/$ext.lang";
+ return $langfile if exists $highlighters{$langfile};
+
read_filetypes() unless $filetypes_read;
if (exists $ext2lang{$ext}) {
- return langfile($ext2lang{$ext});
+ return "$langdefdir/$ext2lang{$ext}.lang";
}
# If a language only has one common extension, it will not
# be listed in filetypes, so check the langfile.
- elsif (-e langfile($ext)) {
- return langfile($ext);
+ elsif (-e $langfile) {
+ return $langfile;
}
else {
return undef;
@@ -122,16 +123,21 @@ sub highlight ($$) {
return $input;
}
- my $gen = highlightc::CodeGenerator_getInstance($highlightc::XHTML);
- $gen->setFragmentCode(1); # generate html fragment
- $gen->setHTMLEnclosePreTag(1); # include stylish <pre>
- $gen->initLanguage($langfile);
- $gen->initTheme("/dev/null"); # theme is not needed because CSS is not emitted
- $gen->setEncoding("utf-8");
+ my $gen;
+ if (! exists $highlighters{$langfile}) {
+ $gen = highlightc::CodeGenerator_getInstance($highlightc::XHTML);
+ $gen->setFragmentCode(1); # generate html fragment
+ $gen->setHTMLEnclosePreTag(1); # include stylish <pre>
+ $gen->initLanguage($langfile);
+ $gen->initTheme("/dev/null"); # theme is not needed because CSS is not emitted
+ $gen->setEncoding("utf-8");
+ $highlighters{$langfile}=$gen;
+ }
+ else {
+ $gen=$highlighters{$langfile};
+ }
- my $output=$gen->generateString($input);
- highlightc::CodeGenerator_deleteInstance($gen);
- return $output;
+ return $gen->generateString($input);
}
1