X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/666a9613a12e3b3d36cdd1e818c44f1890f05b0d..76746c5fe6a8e851b971c8222a4929fe3be7f60a:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index b895e12fc..73d2a9763 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -1536,7 +1536,7 @@ sub loadindex () { }; } elsif (exists $d->{depends_simple}) { - $depends{$page}=$d->{depends_simple}; + $depends_simple{$page}=$d->{depends_simple}; } if (exists $d->{dependslist}) { # old format @@ -1776,22 +1776,41 @@ sub add_depends ($$;@) { my $simple=$pagespec =~ /$config{wiki_file_regexp}/ && $pagespec !~ /[\s*?()!]/; - my $deptype=$DEPEND_CONTENT; + my $deptype=0; if (@_) { my %params=@_; - # Is the pagespec limited to terms that will continue - # to match pages as long as those pages exist? - my $limited=1; - while ($limited && $pagespec=~m/(\w+)\([^\)]*\)/g) { - $limited = $1 =~ /^(glob|internal|creation_month|creation_day|creation_year|created_before|created_after)$/; + if ($params{presence}) { + # Is the pagespec limited to terms that will continue + # to match pages as long as those pages exist? + my $presence_limited=1; + while ($presence_limited && $pagespec=~m/(\w+)\([^\)]*\)/g) { + $presence_limited = $1 =~ /^(glob|internal|creation_month|creation_day|creation_year|created_before|created_after)$/; + } + if ($presence_limited) { + $deptype=$deptype | $DEPEND_PRESENCE; + } + else { + $deptype=$deptype | $DEPEND_CONTENT; + } + } + if ($params{links}) { + # Is the pagespec limited to terms that will continue + # to match pages as long as those pages exist and + # link to the same places? + my $links_limited=1; + while ($links_limited && $pagespec=~m/(\w+)\([^\)]*\)/g) { + $links_limited = $1 =~ /^(glob|internal|creation_month|creation_day|creation_year|created_before|created_after|backlink)$/; + } + if ($links_limited) { + $deptype=$deptype | $DEPEND_LINKS; + } + else { + $deptype=$deptype | $DEPEND_CONTENT; + } } - - $deptype=$deptype & ~$DEPEND_CONTENT | $DEPEND_PRESENCE - if $params{presence} && $limited; - $deptype=$deptype & ~$DEPEND_CONTENT | $DEPEND_LINKS - if $params{links} && $limited; } + $deptype=$DEPEND_CONTENT unless $deptype; if ($simple) { $depends_simple{$page}{lc $pagespec} |= $deptype; @@ -1907,10 +1926,10 @@ sub pagespec_translate ($) { }gx) { my $word=$1; if (lc $word eq 'and') { - $code.=' &&'; + $code.=' &'; } elsif (lc $word eq 'or') { - $code.=' ||'; + $code.=' |'; } elsif ($word eq "(" || $word eq ")" || $word eq "!") { $code.=' '.$word; @@ -1996,36 +2015,40 @@ sub glob2re ($) { package IkiWiki::FailReason; use overload ( - '""' => sub { ${$_[0]} }, + '""' => sub { $_[0][0] }, '0+' => sub { 0 }, '!' => sub { bless $_[0], 'IkiWiki::SuccessReason'}, + '&' => sub { $_[0][1]={%{$_[0][1]}, %{$_[1][1]}}; $_[0] }, + '|' => sub { $_[1][1]={%{$_[0][1]}, %{$_[1][1]}}; $_[1] }, fallback => 1, ); -sub new { - my $class = shift; - my $value = shift; - return bless \$value, $class; -} - -package IkiWiki::ErrorReason; - -our @ISA = 'IkiWiki::FailReason'; +our @ISA = 'IkiWiki::SuccessReason'; package IkiWiki::SuccessReason; use overload ( - '""' => sub { ${$_[0]} }, + '""' => sub { $_[0][0] }, '0+' => sub { 1 }, '!' => sub { bless $_[0], 'IkiWiki::FailReason'}, + '&' => sub { $_[1][1]={%{$_[0][1]}, %{$_[1][1]}}; $_[1] }, + '|' => sub { $_[0][1]={%{$_[0][1]}, %{$_[1][1]}}; $_[0] }, fallback => 1, ); sub new { my $class = shift; my $value = shift; - return bless \$value, $class; -}; + return bless [$value, {@_}], $class; +} + +sub influences { + return keys %{$_[0][1]}; +} + +package IkiWiki::ErrorReason; + +our @ISA = 'IkiWiki::FailReason'; package IkiWiki::PageSpec;