summaryrefslogtreecommitdiff
path: root/doc/bugs/multiple_pages_with_same_name.mdwn
blob: 26269c9ce9227041238b122d272256ded9f4aaa3 (plain)

I'm just working on an updated solution to [[todo/automatic_use_of_syntax_plugin_on_source_code_files]] (see also [[plugins/contrib/highlightcode]] or [[plugins/contrib/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.

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);

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.
-$IkiWiki::hooks{htmlize}{mdwn}=1;
+$IkiWiki::hooks{htmlize}{mdwn}{call}=1;
 
 is(pagename("foo.mdwn"), "foo");
 is(pagename("foo/bar.mdwn"), "foo/bar");

I wonder if this patch will also be useful:

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 {
 					$f=~s/^\Q$config{srcdir}\E\/?//;
 					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;
 				}
 			}
 		},