allow format to use any language supported by highlight
authorJoey Hess <joey@gnu.kitenet.net>
Sat, 23 May 2009 09:17:26 +0000 (05:17 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Sat, 23 May 2009 09:17:26 +0000 (05:17 -0400)
format: Provide a htmlizefallback hook that other plugins can use to
handle formats that are not suitable for general-purpose htmlize hooks.

highlight: Use the hook to allow formatting of any language/extension,
without it needing to be enabled for standalone source files.

highlight: If the highlight perl binding is not available, fallback
safely to a passthrough mode.

IkiWiki/Plugin/format.pm
IkiWiki/Plugin/highlight.pm
debian/changelog
doc/plugins/highlight.mdwn
doc/todo/syntax_highlighting.mdwn

index bbe3aa9fee56e28b978e8d11c0f5f71d6d1b8824..1513cbed72a67447fa8bcedd9bff1f10ce076262 100644 (file)
@@ -10,21 +10,33 @@ sub import {
 }
 
 sub preprocess (@) {
-       my $format=$_[0];
-       shift; shift;
-       my $text=$_[0];
-       shift; shift;
        my %params=@_;
+       my $format=shift;
+       shift;
+       my $text=IkiWiki::preprocess($params{page}, $params{destpage}, shift);
+       shift;
 
        if (! defined $format || ! defined $text) {
                error(gettext("must specify format and text"));
        }
-       elsif (! exists $IkiWiki::hooks{htmlize}{$format}) {
-               error(sprintf(gettext("unsupported page format %s"), $format));
+       elsif (exists $IkiWiki::hooks{htmlize}{$format}) {
+               return IkiWiki::htmlize($params{page}, $params{destpage},
+                                       $format, $text);
        }
+       else {
+               # Other plugins can register htmlizefallback
+               # hooks to add support for page types
+               # not suitable for htmlize. Try them until
+               # one succeeds.
+               my $ret;
+               IkiWiki::run_hooks(htmlizefallback => sub {
+                       $ret=shift->($format, $text)
+                               unless defined $ret;
+               });
+               return $ret if defined $ret;
 
-       return IkiWiki::htmlize($params{page}, $params{destpage}, $format,
-               IkiWiki::preprocess($params{page}, $params{destpage}, $text));
+               error(sprintf(gettext("unsupported page format %s"), $format));
+       }
 }
 
 1
index 117ab5898a427607fcc672822ebb4198fb7f12a6..f116c41ddc0d14b08c2e017b0e36c6daea9fc890 100644 (file)
@@ -4,7 +4,6 @@ package IkiWiki::Plugin::highlight;
 use warnings;
 use strict;
 use IkiWiki 3.00;
-use highlight;
 
 # locations of highlight's files
 my $filetypes="/etc/highlight/filetypes.conf";
@@ -13,6 +12,9 @@ my $langdefdir="/usr/share/highlight/langDefs";
 sub import {
        hook(type => "getsetup", id => "highlight",  call => \&getsetup);
        hook(type => "checkconfig", id => "highlight", call => \&checkconfig);
+       # this hook is used by the format plugin
+       hook(type => "htmlizefallback", id => "highlight", call =>
+               \&htmlizefallback);
 }
 
 sub getsetup () {
@@ -59,6 +61,17 @@ sub checkconfig () {
        }
 }
 
+sub htmlizefallback {
+       my $format=lc shift;
+       my $langfile=ext2langfile($format);
+
+       if (! defined $langfile) {
+               return;
+       }
+
+       return highlight($langfile, shift);
+}
+
 my %ext2lang;
 my $filetypes_read=0;
 
@@ -103,6 +116,12 @@ sub highlight ($$) {
        my $langfile=shift;
        my $input=shift;
 
+       eval q{use highlight};
+       if ($@) {
+               print STDERR gettext("warning: highlight perl module not available; falling back to pass through");
+               return $input;
+       }
+
        my $gen = highlightc::CodeGenerator_getInstance($highlightc::XHTML);
        $gen->setFragmentCode(1); # generate html fragment
        $gen->setHTMLEnclosePreTag(1); # include stylish <pre>
index db3e32cdafcd2d2984e234a6637be6c8871f17ec..8088fa705245273fa82dbb1db17ad097476de1ae 100644 (file)
@@ -5,6 +5,9 @@ ikiwiki (3.14) UNRELEASED; urgency=low
   * debian/control: Add suggests for libhighlight-perl, although
     that package is not yet created by Debian's highlight source package.
     (See #529869)
+  * format: Provide a htmlizefallback hook that other plugins
+    can use to handle formats that are not suitable for general-purpose
+    htmlize hooks. Used by highlight.
 
  -- Joey Hess <joeyh@debian.org>  Fri, 22 May 2009 22:03:12 -0400
 
index 5172af75901ce6aa8cd7c6eab3adc70c1b32f7c0..44ced80f72837055fe60b6c2b3c991564d6f6abd 100644 (file)
@@ -1,7 +1,7 @@
 [[!template id=plugin name=highlight author="[[Joey]]"]]
 [[!tag type/format]]
 
-This plugin allows ikiwiki to syntax highlight source files, using
+This plugin allows ikiwiki to syntax highlight source code, using
 a fast syntax highlighter that supports over a hundred programming
 languages and file formats.
 
@@ -11,26 +11,10 @@ You will need to install the perl bindings to the
 [highlight library](http://www.andre-simon.de/), which in Debian
 are in the [[!debpkg libhighlight-perl]] package.
 
-## configuration
-
-Nothing will be highlighted by default.
-To enable syntax highlighting, use the `tohighlight` setting in your
-setup file to control which files should be syntax highlighted.
-Here is a typical setting for it, enabling highlighting for files
-with the extensions .c, etc, and also for any files named "Makefile".
-
-       tohighlight => ".c .h .cpp .pl .py Makefile:make",
-
-It knows what language to use for most filename extensions (see
-`/etc/highlight/filetypes.conf` for a partial list), but if you want to
-bind an unusual filename extension, or any file without an extension
-(such as a Makefile), to a language, you can do so by appending a colon
-and the name of the language, as illustrated for Makefiles above.
-
 ## embedding highlighted code
 
 To embed highlighted code on a page, you can use the
-[[ikiwiki/directive/format]] directive.
+[[format]] plugin.
 
 For example:
 
@@ -40,21 +24,36 @@ For example:
        }
        """]]
 
-You can do this for any of the extensions/filenames enabled in
-`tohighlight`.
+       \[[!format diff """
+       -bar
+       +foo
+       """]]
 
-## colors
+You can do this for any extension or language name supported by
+the [highlight library](http://www.andre-simon.de/) -- basically anything
+you can think of should work.
 
-The colors etc used for the syntax highlighting are entirely configurable
-by CSS. See ikiwiki's [[style.css]] for the defaults.
+## highlighting entire source files
 
-## limitations
+To enable syntax highlighting of entire standalone source files, use the
+`tohighlight` setting in your setup file to control which files should be
+syntax highlighted. Here is a typical setting for it, enabling highlighting
+for files with the extensions .c, etc, and also for any files named
+"Makefile".
 
-With this plugin enabled, source files become full-fledged ikiwiki pages,
-which means they can include [[WikiLinks|ikiwiki/wikilink]] and
-[[directives|ikiwiki/directive]] like any other page can, and are also
-affected by the [[smiley]] plugin, if it is enabled. This can be
-annoying if your code accidentially contains things that look like those.
+       tohighlight => ".c .h .cpp .pl .py Makefile:make",
+
+It knows what language to use for most filename extensions (see
+`/etc/highlight/filetypes.conf` for a partial list), but if you want to
+bind an unusual filename extension, or any file without an extension
+(such as a Makefile), to a language, you can do so by appending a colon
+and the name of the language, as illustrated for Makefiles above.
+
+With the plugin configured this way, source files become full-fledged
+wiki pages, which means they can include [[WikiLinks|ikiwiki/wikilink]]
+and [[directives|ikiwiki/directive]] like any other page can, and are also
+affected by the [[smiley]] plugin, if it is enabled. This can be annoying
+if your code accidentially contains things that look like those.
 
 On the other hand, this also allows your syntax highlighed
 source code to contain markdown formatted comments and hyperlinks
@@ -66,7 +65,11 @@ to other code files, like this:
                See \[[bar.h]].
        ""]] */
 
-## security
+Finally, bear in mind that this lets anyone who can edit a page in your
+wiki also edit source code files that are in your wiki. Use appropriate
+caution.
+
+## colors
 
-This lets anyone who can edit a page in your wiki also edit
-source code files that are in your wiki. Use appropriate caution.
+The colors etc used for the syntax highlighting are entirely configurable
+by CSS. See ikiwiki's [[style.css]] for the defaults.
index 01aa7b576c258c676808015afbe1b2597aa431be..3d122829b2fe71bd156db25a87a693b617c57bb3 100644 (file)
@@ -36,8 +36,10 @@ work as source-highlight, but in perl.  I plan to package the base module for de
 releases the 5 or 6 language definitions he has running on his web site, it might be suitable for inclusion in ikiwiki. [[DavidBremner]]
 
 * [[plugins/highlight]] uses [highlight](http://www.andre-simon.de) via
-  its swig bindings. It supports whole files only. It uses either
-  keepextension or noextension, as appropriate for the type of file.
+  its swig bindings. It optionally supports whole files, but also
+  integrates with the format directive to allow formatting of *any* of
+  highlight's supported formats. (For whole files, it uses either
+  keepextension or noextension, as appropriate for the type of file.)
 
 ## General problems / requirements