I'm just working on an updated solution to automatic use of syntax plugin on source code files (see also highlightcode or sourcehighlight).

I realised that this is going to have problems when you ask it to process .c and .h files with the same base name. e.g. hello.c and hello.h.

I tested it briefly with test.java and test.mdwn just to see what would happen. Things got quite strange. The source-highlighting plugin was called (probably for the java file), but then when it calls pagetype($pagesources{$page}) to figure out the file type, that function returns mdwn, which confuses things somewhat.

This is a known possible point of confusion. If there are multiple source files, it will render them both, in an arbitrary sequence, so one "wins". --Joey

Anyway, I'm thinking about possible solutions. The best option I've come up with so far is: when registering an htmlize hook, add a new optional paramter 'keep_extension'. This would make a source file of hello.c generate a page with name hello.c rather than the current hello. This would keep the pages unique (until someone makes hello.c.mdwn...).

Suggestions welcome.

-- Will

Ok, this turned out not to be a hard change. patch is below. With this patch you can tell IkiWiki not to drop the suffix when you register a hook: hook(type => "htmlize", id => $lang, call => \&htmlize, leavesuffix => 1);

I think that's a good solution to the problem that most syntax plugins have struggled with. It makes sense. It doesn't solve the case where you have source files without any extension (eg Makefile), but at least it covers the common cases.

I'm going to be annoying and call it "keepextension", otherwise, applied as-is. --Joey done

diff --git a/IkiWiki.pm b/IkiWiki.pm
index 4e4da11..853f905 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -618,7 +618,7 @@ sub pagename ($) {

    my $type=pagetype($file);
    my $page=$file;
-   $page=~s/\Q.$type\E*$// if defined $type;
+   $page=~s/\Q.$type\E*$// if defined $type && !$hooks{htmlize}{$type}{leavesuffix};
    return $page;

diff --git a/t/pagename.t b/t/pagename.t
index 96e6a87..58811b9 100755
--- a/t/pagename.t
+++ b/t/pagename.t
@@ -6,7 +6,7 @@ use Test::More tests => 5;
 BEGIN { use_ok("IkiWiki"); }

 # Used internally.

 is(pagename("foo.mdwn"), "foo");
 is(pagename("foo/bar.mdwn"), "foo/bar");

I wonder if this patch will also be useful:

Reasonable, applied.

diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index 752d176..3f1b67b 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -279,7 +279,11 @@ sub refresh () {
                else {
                    push @files, $f;
-                   $exists{pagename($f)}=1;
+                   my $pagename = pagename($f);
+                   if ($exists{$pagename}) {
+                       warn(sprintf(gettext("Page %s has multiple possible source pages"), $pagename)."\n");
+                   }
+                   $exists{$pagename}=1;