Merge branch 'master' of ssh://git.ikiwiki.info/srv/git/ikiwiki.info

master
Joey Hess 2008-08-28 13:05:33 -04:00
commit a4d033691a
7 changed files with 115 additions and 101 deletions

View File

@ -7,7 +7,7 @@ News for ikiwiki 2.62:
The previous behaviour can be restored by adding the following to your
ikiwiki setup:
teximg\_prefix => '\documentclass{scrartcl}
teximg_prefix => '\documentclass{scrartcl}
\usepackage[version=3]{mhchem}
\usepackage{amsmath}
\usepackage{amsfonts}

View File

@ -9,3 +9,13 @@ This plugin generates a list of available
Each directive links to a wiki page with the same name. The location of the
pages in the wiki can be controlled via the `directive_description_dir`
setting in the setup file.
There is one optional keyword argument, `generated`. Normally the `listdirectives` directive will
list all built in directives and directives directly registered by [[plugins]]. With this keyword,
`listdirectives` will also list directives generated later. For example, all [[shortcuts]] are
directives generated in turn by the `shortcut` directive. They will only be listed if the `generated` argument is
supplied.
\[[!listdirectives generated]]
This extended list is often quite long, and often contains many undocumented directives.

View File

@ -18,8 +18,8 @@ In my version, there is three options for the header field :
Here is the links to the patch and to a patched version of the plugin :
+ [table.pm.patch](http://lohrun.free.fr/ikiwiki/table.pm.patch)
+ [table.pm](http://lohrun.free.fr/ikiwiki/table.pm)
+ [table.pm.patch](http://alexandre.dupas.free.fr/code/ikiwiki/table.pm.patch)
+ [table.pm](http://alexandre.dupas.free.fr/code/ikiwiki/table.pm)
I hope this might be intresting for some ikiwiki user's.

View File

@ -0,0 +1,5 @@
Tables support a header row or no header, but do not support a header column.
> I have proposed a patch to the table plugin that enable such behaviour: [[table/discussion|plugins/table/discussion]].
>
> -- [[AlexandreDupas]]

View File

@ -142,22 +142,36 @@ The following three inlines work for me with this patch:
>> rest of this patch. In a related change, commands were not able to contain `)` in their parameters. I've extended that so the cannot
>> contain `(` or `)`. -- [[Will]]
>>> Updated patch. Moved the specFuncsRef to the front of the arg list. Still haven't thought through the security implications of
>>> having it in `%params`. I've also removed all the debugging `print` statements. And I've updated the `is_globlist()` function.
>>> I think this is ready for people other than me to have a play. It is not well enough tested to commit just yet.
>>> -- [[Will]]
----
diff --git a/IkiWiki.pm b/IkiWiki.pm
index e476521..07b71d7 100644
index e476521..532aaf5 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -1524,7 +1524,7 @@ sub globlist_to_pagespec ($) { #{{{
@@ -1524,7 +1524,16 @@ sub globlist_to_pagespec ($) { #{{{
sub is_globlist ($) { #{{{
my $s=shift;
- return ( $s =~ /[^\s]+\s+([^\s]+)/ && $1 ne "and" && $1 ne "or" );
+ return 0; #( $s =~ /[^\s]+\s+([^\s]+)/ && $1 ne "and" && $1 ne "or" );
+ return ! ($s =~ /
+ (^\s*
+ [^\s\(]+ # single item
+ (\( # possibly with parens after it
+ ([^\)]* # with stuff inside those parens
+ (\([^\)]*\))*)* # maybe even nested parens
+ \))?\s*$
+ ) |
+ (\s and \s) | (\s or \s) # or we find 'and' or 'or' somewhere
+ /x);
} #}}}
sub safequote ($) { #{{{
@@ -1605,7 +1605,7 @@ sub pagespec_merge ($$) { #{{{
@@ -1605,7 +1614,7 @@ sub pagespec_merge ($$) { #{{{
return "($a) or ($b)";
} #}}}
@ -166,7 +180,7 @@ index e476521..07b71d7 100644
my $spec=shift;
# Support for old-style GlobLists.
@@ -1624,9 +1624,11 @@ sub pagespec_translate ($) { #{{{
@@ -1624,9 +1633,11 @@ sub pagespec_translate ($) { #{{{
|
\) # )
|
@ -180,21 +194,21 @@ index e476521..07b71d7 100644
)
\s* # ignore whitespace
}igx) {
@@ -1640,16 +1642,23 @@ sub pagespec_translate ($) { #{{{
@@ -1640,16 +1651,23 @@ sub pagespec_translate ($) { #{{{
elsif ($word eq "(" || $word eq ")" || $word eq "!") {
$code.=' '.$word;
}
+ elsif ($word =~ /^define\(\s*~(\w+)\s*,(.*)\)$/) {
+ $code .= " (\$specFuncsRef->{$1}=";
+ #$code .= "memoize(";
+ $code .= pagespec_makeperl($2);
+ #$code .= ")";
+ $code .= "memoize(";
+ $code .= &pagespec_makeperl($2);
+ $code .= ")";
+ $code .= ") ";
+ }
elsif ($word =~ /^(\w+)\((.*)\)$/) {
if (exists $IkiWiki::PageSpec::{"match_$1"}) {
- $code.="IkiWiki::PageSpec::match_$1(\$page, ".safequote($2).", \@_)";
+ $code.="IkiWiki::PageSpec::match_$1(\$page, \$specFuncsRef, ".safequote($2).", \@_)";
+ $code.="IkiWiki::PageSpec::match_$1(\$specFuncsRef, \$page, ".safequote($2).", \@_)";
}
else {
$code.=' 0';
@ -202,23 +216,21 @@ index e476521..07b71d7 100644
}
else {
- $code.=" IkiWiki::PageSpec::match_glob(\$page, ".safequote($word).", \@_)";
+ $code.=" IkiWiki::PageSpec::match_glob(\$page, \$specFuncsRef, ".safequote($word).", \@_)";
+ $code.=" IkiWiki::PageSpec::match_glob(\$specFuncsRef, \$page, ".safequote($word).", \@_)";
}
}
@@ -1657,8 +1666,18 @@ sub pagespec_translate ($) { #{{{
@@ -1657,8 +1675,16 @@ sub pagespec_translate ($) { #{{{
$code=0;
}
+ return 'sub { my $page=shift; my $specFuncsRef=shift; '.$code.' }';
+ return 'sub { my $specFuncsRef=shift; my $page=shift; '.$code.' }';
+} #}}}
+
+sub pagespec_translate ($) { #{{{
+ my $spec=shift;
+
+ my $code = pagespec_makeperl($spec);
+
+ print "Spec '$spec' led to perl '$code'\n";
+
no warnings;
- return eval 'sub { my $page=shift; '.$code.' }';
@ -226,23 +238,23 @@ index e476521..07b71d7 100644
} #}}}
sub pagespec_match ($$;@) { #{{{
@@ -1673,7 +1692,7 @@ sub pagespec_match ($$;@) { #{{{
@@ -1673,7 +1699,7 @@ sub pagespec_match ($$;@) { #{{{
my $sub=pagespec_translate($spec);
return IkiWiki::FailReason->new("syntax error in pagespec \"$spec\"") if $@;
- return $sub->($page, @params);
+ return $sub->($page, {}, @params);
+ return $sub->({}, $page, @params);
} #}}}
sub pagespec_valid ($) { #{{{
@@ -1722,13 +1741,77 @@ sub new { #{{{
@@ -1722,11 +1748,71 @@ sub new { #{{{
package IkiWiki::PageSpec;
-sub match_glob ($$;@) { #{{{
+sub check_named_spec($$$;@) {
+ my $page=shift;
+ my $specFuncsRef=shift;
+ my $page=shift;
+ my $specName=shift;
+ my %params=@_;
+
@ -250,24 +262,23 @@ index e476521..07b71d7 100644
+ unless (substr($specName, 0, 1) eq '~');
+
+ $specName = substr($specName, 1);
+ print "Checking pagespec named $specName against page $page\n";
+
+ if (exists $specFuncsRef->{$specName}) {
+ # remove the named spec from the spec refs
+ # when we recurse to avoid infinite recursion
+ my $sub = $specFuncsRef->{$specName};
+ $specFuncsRef->{$specName} = undef;
+ my $result = $sub->($page, $specFuncsRef, %params);
+ my $result = $sub->($specFuncsRef, $page, %params);
+ $specFuncsRef->{$specName} = $sub;
+ return $result;
+ } else {
+ print "Couldn't find pagespec\n";
+ return IkiWiki::FailReason->new("Page spec $specName does not exist");
+ return IkiWiki::FailReason->new("Page spec '$specName' does not exist");
+ }
+}
+
+sub check_named_spec_existential($$$$;@) {
+ my $page=shift;
+ my $specFuncsRef=shift;
+ my $page=shift;
+ my $specName=shift;
+ my $funcref=shift;
+ my %params=@_;
@ -276,8 +287,6 @@ index e476521..07b71d7 100644
+ unless (substr($specName, 0, 1) eq '~');
+ $specName = substr($specName, 1);
+
+ print "Checking (existential) pagespec named $specName against page $page\n";
+
+ if (exists $specFuncsRef->{$specName}) {
+ # remove the named spec from the spec refs
+ # when we recurse to avoid infinite recursion
@ -285,150 +294,136 @@ index e476521..07b71d7 100644
+ $specFuncsRef->{$specName} = undef;
+
+ foreach my $nextpage (keys %IkiWiki::pagesources) {
+ print "Checking $nextpage against $specName\n";
+ if ($sub->($nextpage, $specFuncsRef, %params)) {
+ print "Match! Checking spec $nextpage against function from original page $page\n";
+ my $tempResult = $funcref->($page, $specFuncsRef, $nextpage, %params);
+ if ($sub->($specFuncsRef, $nextpage, %params)) {
+ my $tempResult = $funcref->($specFuncsRef, $page, $nextpage, %params);
+ return $tempResult if ($tempResult);
+ }
+ }
+
+ $specFuncsRef->{$specName} = $sub;
+ return IkiWiki::FailReason->new("No page in spec $specName was successfully matched");
+ return IkiWiki::FailReason->new("No page in spec '$specName' was successfully matched");
+ } else {
+ print "Couldn't find pagespec\n";
+ return IkiWiki::FailReason->new("Page spec $specName does not exist");
+ return IkiWiki::FailReason->new("Named page spec '$specName' does not exist");
+ }
+}
+
+sub match_glob ($$$;@) { #{{{
my $page=shift;
+ my $specFuncsRef=shift;
my $page=shift;
my $glob=shift;
my %params=@_;
my $from=exists $params{location} ? $params{location} : '';
+ print "Matching glob $glob \n";
+
# relative matching
if ($glob =~ m!^\./!) {
$from=~s#/?[^/]+$##;
@@ -1736,6 +1819,10 @@ sub match_glob ($$;@) { #{{{
$glob="$from/$glob" if length $from;
}
+ if (substr($glob, 0, 1) eq '~') {
+ return check_named_spec($page, $specFuncsRef, $glob);
+ return check_named_spec($specFuncsRef, $page, $glob);
+ }
+
my $regexp=IkiWiki::glob2re($glob);
if ($page=~/^$regexp$/i) {
if (! IkiWiki::isinternal($page) || $params{internal}) {
@@ -1750,17 +1837,29 @@ sub match_glob ($$;@) { #{{{
my $from=exists $params{location} ? $params{location} : '';
# relative matching
@@ -1750,17 +1836,23 @@ sub match_glob ($$;@) { #{{{
}
} #}}}
-sub match_internal ($$;@) { #{{{
- return match_glob($_[0], $_[1], @_, internal => 1)
+sub match_internal ($$$;@) { #{{{
+ my $page=shift;
+ my $specFuncsRef=shift;
+ my $glob=shift;
+
+ return match_glob($page, $specFuncsRef, $glob, @_, internal => 1)
+ return match_glob(shift, shift, shift, @_, internal => 1)
} #}}}
-sub match_link ($$;@) { #{{{
+sub match_link ($$$;@) { #{{{
+ my $specFuncsRef=shift;
my $page=shift;
- my $link=lc(shift);
+ my $specFuncsRef=shift;
+ my $fulllink=shift;
+ my $link=lc($fulllink);
my %params=@_;
+ print "Matching link $fulllink \n";
+
my $from=exists $params{location} ? $params{location} : '';
- my $from=exists $params{location} ? $params{location} : '';
+ if (substr($fulllink, 0, 1) eq '~') {
+ return check_named_spec_existential($page, $specFuncsRef, $fulllink, \&match_link);
+ return check_named_spec_existential($specFuncsRef, $page, $fulllink, \&match_link);
+ }
+
+ my $from=exists $params{location} ? $params{location} : '';
+
# relative matching
if ($link =~ m!^\.! && defined $from) {
$from=~s#/?[^/]+$##;
@@ -1784,12 +1883,16 @@ sub match_link ($$;@) { #{{{
@@ -1778,17 +1870,21 @@ sub match_link ($$;@) { #{{{
}
else {
return IkiWiki::SuccessReason->new("$page links to page $p matching $link")
- if match_glob($p, $link, %params);
+ if match_glob($specFuncsRef, $p, $link, %params);
}
}
return IkiWiki::FailReason->new("$page does not link to $link");
} #}}}
-sub match_backlink ($$;@) { #{{{
- return match_link($_[1], $_[0], @_);
+sub match_backlink ($$$;@) { #{{{
+ my $page=shift;
+ my $specFuncsRef=shift;
+ my $page=shift;
+ my $backlink=shift;
+ return match_link($backlink, $specFuncsRef, $page, @_);
+ return match_link($specFuncsRef, $backlink, $page, @_);
} #}}}
-sub match_created_before ($$;@) { #{{{
+sub match_created_before ($$$;@) { #{{{
my $page=shift;
+ my $specFuncsRef=shift;
my $page=shift;
my $testpage=shift;
if (exists $IkiWiki::pagectime{$testpage}) {
@@ -1805,8 +1908,9 @@ sub match_created_before ($$;@) { #{{{
@@ -1805,7 +1901,8 @@ sub match_created_before ($$;@) { #{{{
}
} #}}}
-sub match_created_after ($$;@) { #{{{
+sub match_created_after ($$$;@) { #{{{
my $page=shift;
+ my $specFuncsRef=shift;
my $page=shift;
my $testpage=shift;
if (exists $IkiWiki::pagectime{$testpage}) {
@@ -1822,8 +1926,12 @@ sub match_created_after ($$;@) { #{{{
@@ -1822,8 +1919,12 @@ sub match_created_after ($$;@) { #{{{
}
} #}}}
-sub match_creation_day ($$;@) { #{{{
- if ((gmtime($IkiWiki::pagectime{shift()}))[3] == shift) {
+sub match_creation_day ($$$;@) { #{{{
+ my $page=shift;
+ shift;
+ my $page=shift;
+ my $time=shift;
+
+ if ((gmtime($IkiWiki::pagectime{$page}))[3] == $time) {
return IkiWiki::SuccessReason->new('creation_day matched');
}
else {
@@ -1831,8 +1939,12 @@ sub match_creation_day ($$;@) { #{{{
@@ -1831,8 +1932,12 @@ sub match_creation_day ($$;@) { #{{{
}
} #}}}
-sub match_creation_month ($$;@) { #{{{
- if ((gmtime($IkiWiki::pagectime{shift()}))[4] + 1 == shift) {
+sub match_creation_month ($$$;@) { #{{{
+ my $page=shift;
+ shift;
+ my $page=shift;
+ my $time=shift;
+
+ if ((gmtime($IkiWiki::pagectime{$page}))[4] + 1 == $time) {
return IkiWiki::SuccessReason->new('creation_month matched');
}
else {
@@ -1840,8 +1952,12 @@ sub match_creation_month ($$;@) { #{{{
@@ -1840,8 +1945,12 @@ sub match_creation_month ($$;@) { #{{{
}
} #}}}
-sub match_creation_year ($$;@) { #{{{
- if ((gmtime($IkiWiki::pagectime{shift()}))[5] + 1900 == shift) {
+sub match_creation_year ($$$;@) { #{{{
+ my $page=shift;
+ shift;
+ my $page=shift;
+ my $time=shift;
+
+ if ((gmtime($IkiWiki::pagectime{$page}))[5] + 1900 == $time) {
@ -460,7 +455,7 @@ index f1f792a..a410e48 100644
my $ip=shift;
my %params=@_;
diff --git a/IkiWiki/Plugin/conditional.pm b/IkiWiki/Plugin/conditional.pm
index 7716fce..2110ca0 100644
index 7716fce..c0dbb50 100644
--- a/IkiWiki/Plugin/conditional.pm
+++ b/IkiWiki/Plugin/conditional.pm
@@ -70,7 +70,8 @@ sub preprocess_if (@) { #{{{
@ -479,14 +474,14 @@ index 7716fce..2110ca0 100644
-sub match_sourcepage ($$;@) { #{{{
+sub match_sourcepage ($$$;@) { #{{{
shift;
+ my $specFuncsRef=shift;
shift;
my $glob=shift;
my %params=@_;
return IkiWiki::FailReason->new("cannot match sourcepage") unless exists $params{sourcepage};
- if (match_glob($params{sourcepage}, $glob, @_)) {
+ if (match_glob($params{sourcepage}, $specFuncsRef, $glob, @_)) {
+ if (match_glob($specFuncsRef, $params{sourcepage}, $glob, @_)) {
return IkiWiki::SuccessReason->new("sourcepage matches $glob");
}
else {
@ -496,14 +491,14 @@ index 7716fce..2110ca0 100644
-sub match_destpage ($$;@) { #{{{
+sub match_destpage ($$$;@) { #{{{
shift;
+ my $specFuncsRef=shift;
shift;
my $glob=shift;
my %params=@_;
return IkiWiki::FailReason->new("cannot match destpage") unless exists $params{destpage};
- if (match_glob($params{destpage}, $glob, @_)) {
+ if (match_glob($params{destpage}, $specFuncsRef, $glob, @_)) {
+ if (match_glob($specFuncsRef, $params{destpage}, $glob, @_)) {
return IkiWiki::SuccessReason->new("destpage matches $glob");
}
else {
@ -518,53 +513,49 @@ index 7716fce..2110ca0 100644
shift;
my %params=@_;
diff --git a/IkiWiki/Plugin/filecheck.pm b/IkiWiki/Plugin/filecheck.pm
index 6f71be3..bf472c5 100644
index 6f71be3..3592342 100644
--- a/IkiWiki/Plugin/filecheck.pm
+++ b/IkiWiki/Plugin/filecheck.pm
@@ -66,8 +66,9 @@ sub humansize ($) { #{{{
@@ -66,7 +66,8 @@ sub humansize ($) { #{{{
package IkiWiki::PageSpec;
-sub match_maxsize ($$;@) { #{{{
+sub match_maxsize ($$$;@) { #{{{
my $page=shift;
+ shift;
my $page=shift;
my $maxsize=eval{IkiWiki::Plugin::attachment::parsesize(shift)};
if ($@) {
return IkiWiki::FailReason->new("unable to parse maxsize (or number too large)");
@@ -87,8 +88,9 @@ sub match_maxsize ($$;@) { #{{{
@@ -87,7 +88,8 @@ sub match_maxsize ($$;@) { #{{{
}
} #}}}
-sub match_minsize ($$;@) { #{{{
+sub match_minsize ($$$;@) { #{{{
my $page=shift;
+ shift;
my $page=shift;
my $minsize=eval{IkiWiki::Plugin::attachment::parsesize(shift)};
if ($@) {
return IkiWiki::FailReason->new("unable to parse minsize (or number too large)");
@@ -108,8 +110,9 @@ sub match_minsize ($$;@) { #{{{
@@ -108,7 +110,8 @@ sub match_minsize ($$;@) { #{{{
}
} #}}}
-sub match_mimetype ($$;@) { #{{{
+sub match_mimetype ($$$;@) { #{{{
my $page=shift;
+ shift;
my $page=shift;
my $wanted=shift;
my %params=@_;
@@ -138,8 +141,9 @@ sub match_mimetype ($$;@) { #{{{
@@ -138,7 +141,8 @@ sub match_mimetype ($$;@) { #{{{
}
} #}}}
-sub match_virusfree ($$;@) { #{{{
+sub match_virusfree ($$$;@) { #{{{
my $page=shift;
+ shift;
my $page=shift;
my $wanted=shift;
my %params=@_;
@@ -180,7 +184,7 @@ sub match_virusfree ($$;@) { #{{{
}
} #}}}
@ -575,17 +566,17 @@ index 6f71be3..bf472c5 100644
if (defined IkiWiki::pagetype($filename)) {
diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
index b2c85c8..1ee6a69 100644
index b2c85c8..788f248 100644
--- a/IkiWiki/Plugin/meta.pm
+++ b/IkiWiki/Plugin/meta.pm
@@ -264,6 +264,7 @@ sub pagetemplate (@) { #{{{
@@ -263,6 +263,7 @@ sub pagetemplate (@) { #{{{
sub match { #{{{
my $field=shift;
my $page=shift;
+ shift;
my $page=shift;
# turn glob into a safe regexp
my $re=IkiWiki::glob2re(shift);
@@ -291,23 +292,23 @@ sub match { #{{{
package IkiWiki::PageSpec;

View File

@ -0,0 +1,5 @@
Many plugins seem to create temporary files. Although it is not much code, it is duplicated, and a
typical place for security bugs. Would it be worthwhile to have library functions for creating temporary files
and directories? If nothing else, it would serve as documentation of the "official way".
Off to cut and paste :-) --[[DavidBremner]]

View File

@ -1,6 +1,9 @@
It is possible to set a Page-Title in the meta-plugin, but that one isn't
reused in parentlinks. This patch may fix it.
**This patch may introduce some bugs, i need to investigate**
<ul>
<li> I give pagetitle the full path to a page.
<li> I redefine the 'pagetitle'-sub to deal with it.