X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/3a2cb0ecfff65f728569edbdcc4e30f027c36d67..80a630a3fb64c4fe9ef7ac6d38962c2959c05fbd:/IkiWiki/Plugin/camelcase.pm?ds=inline

diff --git a/IkiWiki/Plugin/camelcase.pm b/IkiWiki/Plugin/camelcase.pm
index 68d399d77..74a8397d7 100644
--- a/IkiWiki/Plugin/camelcase.pm
+++ b/IkiWiki/Plugin/camelcase.pm
@@ -4,19 +4,70 @@ package IkiWiki::Plugin::camelcase;
 
 use warnings;
 use strict;
+use IkiWiki 3.00;
 
-sub import { #{{{
-	IkiWiki::hook(type => "filter", id => "camelcase", call => \&filter);
-} # }}}
+# This regexp is based on the one in Text::WikiFormat.
+my $link_regexp=qr{
+	(?<![^A-Za-z0-9\s])	# try to avoid expanding non-links with a
+				# zero width negative lookbehind for
+				# characters that suggest it's not a link
+	\b			# word boundry
+	(
+		(?:
+			[A-Z]		# Uppercase start
+			[a-z0-9]	# followed by lowercase
+			\w*		# and rest of word
+		)
+		{2,}			# repeated twice
+	)
+}x;
 
-sub filter (@) { #{{{
+sub import {
+	hook(type => "getsetup", id => "camelcase", call => \&getsetup);
+	hook(type => "linkify", id => "camelcase", call => \&linkify);
+	hook(type => "scan", id => "camelcase", call => \&scan);
+}
+
+sub getsetup () {
+	return
+		plugin => {
+			safe => 1,
+			rebuild => undef,
+		},
+		camelcase_ignore => {
+			type => "string",
+			example => [],
+			description => "list of words to not turn into links",
+			safe => 1,
+			rebuild => undef, # might change links
+		},
+}
+
+sub linkify (@) {
 	my %params=@_;
+	my $page=$params{page};
+	my $destpage=$params{destpage};
 
-	# Make CamelCase links work by promoting them to fullfledged
-	# WikiLinks. This regexp is based on the one in Text::WikiFormat.
-	$params{content}=~s#(?<![[|"/>=])\b((?:[A-Z][a-z0-9]\w*){2,})#[[$1]]#g;
+	$params{content}=~s{$link_regexp}{
+		ignored($1) ? $1 : htmllink($page, $destpage, linkpage($1))
+	}eg;
 
 	return $params{content};
-} #}}}
+}
+
+sub scan (@) {
+        my %params=@_;
+        my $page=$params{page};
+        my $content=$params{content};
+
+	while ($content =~ /$link_regexp/g) {
+		push @{$links{$page}}, linkpage($1) unless ignored($1)
+	}
+}
+
+sub ignored ($) {
+	my $word=lc shift;
+	grep { $word eq lc $_ } @{$config{'camelcase_ignore'}}
+}
 
 1