aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/camelcase.pm
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki/Plugin/camelcase.pm')
-rw-r--r--IkiWiki/Plugin/camelcase.pm73
1 files changed, 73 insertions, 0 deletions
diff --git a/IkiWiki/Plugin/camelcase.pm b/IkiWiki/Plugin/camelcase.pm
new file mode 100644
index 000000000..088447d6b
--- /dev/null
+++ b/IkiWiki/Plugin/camelcase.pm
@@ -0,0 +1,73 @@
+#!/usr/bin/perl
+# CamelCase links
+package IkiWiki::Plugin::camelcase;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+# 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 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};
+
+ $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) {
+ add_link($page, linkpage($1)) unless ignored($1)
+ }
+}
+
+sub ignored ($) {
+ my $word=lc shift;
+ grep { $word eq lc $_ } @{$config{'camelcase_ignore'}}
+}
+
+1