]> sipb.mit.edu Git - ikiwiki.git/commitdiff
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 (@) {
 }
 
 sub preprocess (@) {
-       my $format=$_[0];
-       shift; shift;
-       my $text=$_[0];
-       shift; shift;
        my %params=@_;
        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"));
        }
 
        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
 }
 
 1
index 117ab5898a427607fcc672822ebb4198fb7f12a6..f116c41ddc0d14b08c2e017b0e36c6daea9fc890 100644 (file)
@@ -4,7 +4,6 @@ package IkiWiki::Plugin::highlight;
 use warnings;
 use strict;
 use IkiWiki 3.00;
 use warnings;
 use strict;
 use IkiWiki 3.00;
-use highlight;
 
 # locations of highlight's files
 my $filetypes="/etc/highlight/filetypes.conf";
 
 # 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);
 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 () {
 }
 
 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;
 
 my %ext2lang;
 my $filetypes_read=0;
 
@@ -103,6 +116,12 @@ sub highlight ($$) {
        my $langfile=shift;
        my $input=shift;
 
        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>
        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)
   * 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
 
 
  -- 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]]
 
 [[!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.
 
 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.
 
 [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
 ## embedding highlighted code
 
 To embed highlighted code on a page, you can use the
-[[ikiwiki/directive/format]] directive.
+[[format]] plugin.
 
 For example:
 
 
 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
 
 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]].
        ""]] */
 
                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
 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
 
 
 ## General problems / requirements