]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/camelcase.pm
Avoid %links accumulating duplicates. (For TOVA)
[ikiwiki.git] / IkiWiki / Plugin / camelcase.pm
index 68d399d77698bb5be52ba48cd3ddaab21bb5b964..088447d6b4d133d0197e6bc3c1df57fd9c3292e8 100644 (file)
@@ -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) {
+               add_link($page, linkpage($1)) unless ignored($1)
+       }
+}
+
+sub ignored ($) {
+       my $word=lc shift;
+       grep { $word eq lc $_ } @{$config{'camelcase_ignore'}}
+}
 
 1