Merge remote branch 'smcv/ready/link-types'
authorJoey Hess <joey@gnu.kitenet.net>
Wed, 7 Apr 2010 02:50:19 +0000 (22:50 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Wed, 7 Apr 2010 02:50:19 +0000 (22:50 -0400)
1  2 
IkiWiki.pm

diff --combined IkiWiki.pm
index 0cbc847887b1b6d8493268e41721a7f8d8784a32,6ea0fb3f358c1fc48551db2ea9f3af9a363b1ff6..2415307d456b1f0b2aabcdaa569666e33337475c
@@@ -14,7 -14,7 +14,7 @@@ use open qw{:utf8 :std}
  use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase
            %pagestate %wikistate %renderedfiles %oldrenderedfiles
            %pagesources %destsources %depends %depends_simple %hooks
-           %forcerebuild %loaded_plugins};
+           %forcerebuild %loaded_plugins %typedlinks %oldtypedlinks};
  
  use Exporter q{import};
  our @EXPORT = qw(hook debug error template htmlpage deptype
@@@ -24,7 -24,7 +24,7 @@@
                 add_underlay pagetitle titlepage linkpage newpagefile
                 inject add_link
                   %config %links %pagestate %wikistate %renderedfiles
-                  %pagesources %destsources);
+                  %pagesources %destsources %typedlinks);
  our $VERSION = 3.00; # plugin interface version, next is ikiwiki version
  our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE
  our $installdir='/usr'; # INSTALLDIR_AUTOREPLACE done by Makefile, DNE
@@@ -1164,7 -1164,7 +1164,7 @@@ sub htmlize ($$$$) 
        my $content=shift;
        
        my $oneline = $content !~ /\n/;
 -
 +      
        if (exists $hooks{htmlize}{$type}) {
                $content=$hooks{htmlize}{$type}{call}->(
                        page => $page,
        
        if ($oneline) {
                # hack to get rid of enclosing junk added by markdown
 -              # and other htmlizers
 +              # and other htmlizers/sanitizers
                $content=~s/^<p>//i;
 -              $content=~s/<\/p>$//i;
 -              chomp $content;
 +              $content=~s/<\/p>\n*$//i;
        }
  
        return $content;
@@@ -1502,7 -1503,7 +1502,7 @@@ sub loadindex () 
        if (! $config{rebuild}) {
                %pagesources=%pagemtime=%oldlinks=%links=%depends=
                %destsources=%renderedfiles=%pagecase=%pagestate=
-               %depends_simple=();
+               %depends_simple=%typedlinks=%oldtypedlinks=();
        }
        my $in;
        if (! open ($in, "<", "$config{wikistatedir}/indexdb")) {
                        if (exists $d->{state}) {
                                $pagestate{$page}=$d->{state};
                        }
+                       if (exists $d->{typedlinks}) {
+                               $typedlinks{$page}=$d->{typedlinks};
+                               while (my ($type, $links) = each %{$typedlinks{$page}}) {
+                                       next unless %$links;
+                                       $oldtypedlinks{$page}{$type} = {%$links};
+                               }
+                       }
                }
                $oldrenderedfiles{$page}=[@{$d->{dest}}];
        }
@@@ -1616,6 -1625,10 +1624,10 @@@ sub saveindex () 
                        $index{page}{$src}{depends_simple} = $depends_simple{$page};
                }
  
+               if (exists $typedlinks{$page} && %{$typedlinks{$page}}) {
+                       $index{page}{$src}{typedlinks} = $typedlinks{$page};
+               }
                if (exists $pagestate{$page}) {
                        foreach my $id (@hookids) {
                                foreach my $key (keys %{$pagestate{$page}{$id}}) {
@@@ -1925,12 -1938,17 +1937,17 @@@ sub inject 
        use warnings;
  }
  
- sub add_link ($$) {
+ sub add_link ($$;$) {
        my $page=shift;
        my $link=shift;
+       my $type=shift;
  
        push @{$links{$page}}, $link
                unless grep { $_ eq $link } @{$links{$page}};
+       if (defined $type) {
+               $typedlinks{$page}{$type}{$link} = 1;
+       }
  }
  
  sub pagespec_translate ($) {
@@@ -2211,6 -2229,11 +2228,11 @@@ sub match_link ($$;@) 
  
        $link=derel($link, $params{location});
        my $from=exists $params{location} ? $params{location} : '';
+       my $linktype=$params{linktype};
+       my $qualifier='';
+       if (defined $linktype) {
+               $qualifier=" with type $linktype";
+       }
  
        my $links = $IkiWiki::links{$page};
        return IkiWiki::FailReason->new("$page has no links", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
        my $bestlink = IkiWiki::bestlink($from, $link);
        foreach my $p (@{$links}) {
                if (length $bestlink) {
-                       return IkiWiki::SuccessReason->new("$page links to $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
-                               if $bestlink eq IkiWiki::bestlink($page, $p);
+                       if ((!defined $linktype || exists $IkiWiki::typedlinks{$page}{$linktype}{$p}) && $bestlink eq IkiWiki::bestlink($page, $p)) {
+                               return IkiWiki::SuccessReason->new("$page links to $link$qualifier", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
+                       }
                }
                else {
-                       return IkiWiki::SuccessReason->new("$page links to page $p matching $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
-                               if match_glob($p, $link, %params);
+                       if ((!defined $linktype || exists $IkiWiki::typedlinks{$page}{$linktype}{$p}) && match_glob($p, $link, %params)) {
+                               return IkiWiki::SuccessReason->new("$page links to page $p$qualifier, matching $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
+                       }
                        my ($p_rel)=$p=~/^\/?(.*)/;
                        $link=~s/^\///;
-                       return IkiWiki::SuccessReason->new("$page links to page $p_rel matching $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
-                               if match_glob($p_rel, $link, %params);
+                       if ((!defined $linktype || exists $IkiWiki::typedlinks{$page}{$linktype}{$p_rel}) && match_glob($p_rel, $link, %params)) {
+                               return IkiWiki::SuccessReason->new("$page links to page $p_rel$qualifier, matching $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
+                       }
                }
        }
-       return IkiWiki::FailReason->new("$page does not link to $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1);
+       return IkiWiki::FailReason->new("$page does not link to $link$qualifier", $page => $IkiWiki::DEPEND_LINKS, "" => 1);
  }
  
  sub match_backlink ($$;@) {