Update patch

master
http://www.cse.unsw.edu.au/~willu/ 2008-09-19 01:50:35 -04:00 committed by Joey Hess
parent ec15e15983
commit 53b2f15510
1 changed files with 92 additions and 10 deletions

View File

@ -162,6 +162,9 @@ See also:
>> Anyway, here are the plugins. As noted above these are only preliminary, exploratory, attempts. -- [[Will]]
>>>> I've just updated the second of the two patches below. The two patches are not mutually
>>>> exclusive, but I'm leaning towards the second as more useful (for the things I'm doing). -- [[Will]]
#!/usr/bin/perl
# Interpret YAML data to make a web form
package IkiWiki::Plugin::form;
@ -388,10 +391,13 @@ See also:
use strict;
use IkiWiki 2.00;
my $inTable = 0;
sub import { #{{{
hook(type => "getsetup", id => "data", call => \&getsetup);
hook(type => "needsbuild", id => "data", call => \&needsbuild);
hook(type => "preprocess", id => "data", call => \&preprocess, scan => 1);
hook(type => "preprocess", id => "datatable", call => \&preprocess_table, scan => 1); # does this need scan?
} # }}}
sub getsetup () { #{{{
@ -418,14 +424,68 @@ See also:
}
sub preprocess (@) { #{{{
my %params=@_;
my @argslist = @_;
my %params=@argslist;
$pagestate{$params{page}}{data}{$params{key}} = $params{value};
my $html = '';
my $class = defined $params{class}
? 'class="'.$params{class}.'"'
: '';
return IkiWiki::preprocess($params{page}, $params{destpage},
IkiWiki::filter($params{page}, $params{destpage}, $params{value})) if defined wantarray;
if ($inTable) {
$html = "<th $class >$params{key}:</th><td $class >";
} else {
$html = "<span $class >$params{key}:";
}
while (scalar(@argslist) > 1) {
my $type = shift @argslist;
my $data = shift @argslist;
if ($type eq 'link') {
# store links raw
$pagestate{$params{page}}{data}{$params{key}}{link}{$data} = 1;
my $link=IkiWiki::linkpage($data);
add_depends($params{page}, $link);
$html .= ' ' . htmllink($params{page}, $params{destpage}, $link);
} elsif ($type eq 'data') {
$data = IkiWiki::preprocess($params{page}, $params{destpage},
IkiWiki::filter($params{page}, $params{destpage}, $data));
$html .= ' ' . $data;
# store data after processing - allows pagecounts to be stored, etc.
$pagestate{$params{page}}{data}{$params{key}}{data}{$data} = 1;
}
}
if ($inTable) {
$html .= "</td>";
} else {
$html .= "</span>";
}
return $html;
} # }}}
sub preprocess_table (@) { #{{{
my %params=@_;
my @lines;
push @lines, defined $params{class}
? "<table class=\"".$params{class}.'">'
: '<table>';
$inTable = 1;
foreach my $line (split(/\n/, $params{datalist})) {
push @lines, "<tr>" . IkiWiki::preprocess($params{page}, $params{destpage},
IkiWiki::filter($params{page}, $params{destpage}, $line)) . "</tr>";
}
$inTable = 0;
push @lines, '</table>';
return join("\n", @lines);
} #}}}
package IkiWiki::PageSpec;
@ -436,8 +496,6 @@ See also:
my $key=shift @args;
my $value=shift @args;
my $file = $IkiWiki::pagesources{$page};
if (! exists $IkiWiki::pagestate{$page}{data}) {
return IkiWiki::FailReason->new("page does not contain any data directives");
}
@ -446,13 +504,37 @@ See also:
return IkiWiki::FailReason->new("page does not contain data key '$key'");
}
my $formVal = $IkiWiki::pagestate{$page}{data}{$key};
if ($formVal eq $value) {
if ($IkiWiki::pagestate{$page}{data}{$key}{data}{$value}) {
return IkiWiki::SuccessReason->new("value matches");
} else {
return IkiWiki::FailReason->new("value does not match");
}
} #}}}
sub match_data_link ($$;@) { #{{{
my $page=shift;
my $argSet=shift;
my @params=@_;
my @args=split(/,/, $argSet);
my $key=shift @args;
my $value=shift @args;
if (! exists $IkiWiki::pagestate{$page}{data}) {
return IkiWiki::FailReason->new("page $page does not contain any data directives and so cannot match a link");
}
if (! exists $IkiWiki::pagestate{$page}{data}{$key}) {
return IkiWiki::FailReason->new("page $page does not contain data key '$key'");
}
foreach my $link (keys %{ $IkiWiki::pagestate{$page}{data}{$key}{link} }) {
# print STDERR "Checking if $link matches glob $value\n";
if (match_glob($link, $value, @params)) {
return IkiWiki::SuccessReason->new("Data link on page $page with key $key matches glob $value: $link");
}
}
return IkiWiki::FailReason->new("No data link on page $page with key $key matches glob $value");
} #}}}
1