* Change order of linkify and preprocess; first preprocess and then linkify.

This allows passing a wikilink inside a parameter to a preprocessor
  directive without it being expanded to html, and leaking out of the
  parameter, which had required some non-obvious use of triple-quoting
  to avoid. Note that any preprocessor plugins that output something
  that looks like a wikilink will now have it treated as such; AFAIK
  this doesn't change any behavior though except for the template plugin.
* Enable preprocessor directives when previewing an edit.
master
joey 2006-08-23 20:23:57 +00:00
parent 1f085aa76d
commit d4ca3b3f50
7 changed files with 71 additions and 17 deletions

View File

@ -411,8 +411,12 @@ sub cgi_editpage ($$) { #{{{
value => $content, force => 1); value => $content, force => 1);
$form->field(name => "comments", $form->field(name => "comments",
value => $comments, force => 1); value => $comments, force => 1);
$config{rss}=0; # avoid preview writing an rss feed!
$form->tmpl_param("page_preview", $form->tmpl_param("page_preview",
htmlize($type, linkify($page, "", filter($page, $content)))); htmlize($type,
linkify($page, "",
preprocess($page, $page,
filter($page, $content)))));
} }
else { else {
$form->tmpl_param("page_preview", ""); $form->tmpl_param("page_preview", "");

View File

@ -116,8 +116,8 @@ sub preprocess_inline (@) { #{{{
my $type=pagetype($file); my $type=pagetype($file);
if (defined $type) { if (defined $type) {
$ret.="\n". $ret.="\n".
preprocess($page, $params{page},
linkify($page, $params{page}, linkify($page, $params{page},
preprocess($page, $params{page},
filter($page, filter($page,
readfile(srcfile($file))))); readfile(srcfile($file)))));
} }
@ -145,8 +145,8 @@ sub get_inline_content ($$) { #{{{
my $type=pagetype($file); my $type=pagetype($file);
if (defined $type) { if (defined $type) {
return htmlize($type, return htmlize($type,
preprocess($page, $destpage,
linkify($page, $destpage, linkify($page, $destpage,
preprocess($page, $destpage,
filter($page, filter($page,
readfile(srcfile($file)))))); readfile(srcfile($file))))));
} }

View File

@ -29,8 +29,8 @@ sub sidebar_content ($) { #{{{
my $content=IkiWiki::readfile(IkiWiki::srcfile($sidebar_file)); my $content=IkiWiki::readfile(IkiWiki::srcfile($sidebar_file));
return unless length $content; return unless length $content;
return IkiWiki::htmlize($sidebar_type, return IkiWiki::htmlize($sidebar_type,
IkiWiki::preprocess($sidebar_page, $page,
IkiWiki::linkify($sidebar_page, $page, IkiWiki::linkify($sidebar_page, $page,
IkiWiki::preprocess($sidebar_page, $page,
IkiWiki::filter($sidebar_page, $content)))); IkiWiki::filter($sidebar_page, $content))));
} }

View File

@ -104,11 +104,24 @@ sub preprocess ($$$;$) { #{{{
# Note: preserve order of params, some plugins may # Note: preserve order of params, some plugins may
# consider it significant. # consider it significant.
my @params; my @params;
while ($params =~ /(?:(\w+)=)?(?:"""\n?(.+)"""|"([^"]+)"|(\S+))(?:\s+|$)/sg) { while ($params =~ /(?:(\w+)=)?(?:"""(.*?)"""|"([^"]+)"|(\S+))(?:\s+|$)/sg) {
my $val=(defined $2 ? $2 : (defined $3 ? $3 : $4)); my $key=$1;
chomp $val; my $val;
if (defined $1) { if (defined $2) {
push @params, $1, $val; $val=$2;
$val=~s/\r\n/\n/mg;
$val=~s/^\n+//g;
$val=~s/\n+$//g;
}
elsif (defined $3) {
$val=$3;
}
elsif (defined $4) {
$val=$4;
}
if (defined $key) {
push @params, $key, $val;
} }
else { else {
push @params, $val, ''; push @params, $val, '';
@ -125,7 +138,7 @@ sub preprocess ($$$;$) { #{{{
} }
}; };
$content =~ s{(\\?)\[\[(\w+)\s+((?:(?:\w+=)?(?:""".+"""|"[^"]+"|[^\s\]]+)\s*)*)\]\]}{$handle->($1, $2, $3)}eg; $content =~ s{(\\?)\[\[(\w+)\s+((?:(?:\w+=)?(?:""".*?"""|"[^"]+"|[^\s\]]+)\s*)*)\]\]}{$handle->($1, $2, $3)}seg;
return $content; return $content;
} #}}} } #}}}
@ -268,8 +281,8 @@ sub render ($) { #{{{
$links{$page}=[findlinks($page, $content)]; $links{$page}=[findlinks($page, $content)];
$content=linkify($page, $page, $content);
$content=preprocess($page, $page, $content); $content=preprocess($page, $page, $content);
$content=linkify($page, $page, $content);
$content=htmlize($type, $content); $content=htmlize($type, $content);
check_overwrite("$config{destdir}/".htmlpage($page), $page); check_overwrite("$config{destdir}/".htmlpage($page), $page);

10
debian/changelog vendored
View File

@ -16,8 +16,16 @@ ikiwiki (1.22) UNRELEASED; urgency=low
* Make pagespec merge code smarter about merging duplicate pagespecs. * Make pagespec merge code smarter about merging duplicate pagespecs.
* Patch from Jordà Polo to make Setup::Standard support hashes in config * Patch from Jordà Polo to make Setup::Standard support hashes in config
files. files.
* Change order of linkify and preprocess; first preprocess and then linkify.
This allows passing a wikilink inside a parameter to a preprocessor
directive without it being expanded to html, and leaking out of the
parameter, which had required some non-obvious use of triple-quoting
to avoid. Note that any preprocessor plugins that output something
that looks like a wikilink will now have it treated as such; AFAIK
this doesn't change any behavior though except for the template plugin.
* Enable preprocessor directives when previewing an edit.
-- Joey Hess <joeyh@debian.org> Wed, 23 Aug 2006 14:35:18 -0400 -- Joey Hess <joeyh@debian.org> Wed, 23 Aug 2006 15:30:09 -0400
ikiwiki (1.21) unstable; urgency=low ikiwiki (1.21) unstable; urgency=low

View File

@ -9,15 +9,18 @@ and inserted into pages in the wiki. Using a template works like this:
This fills out the template `templates/foo`, filling in the `color` and `age` This fills out the template `templates/foo`, filling in the `color` and `age`
fields on it with the specified values, and inserts the result into the page. fields on it with the specified values, and inserts the result into the page.
If a value is triple-quoted, it can include any markup that would be (Note that if the template doesn't exist, the page will provide a link that
allowed in the wiki page outside the template. Combined with multi-line can be used to create it.)
quoted values, this allows for large chunks of marked up text to be
embedded into a template: A value can include any markup that would be allowed in the wiki page
outside the template. Triple-quoting the value even allows quotes to be
included in it. Combined with multi-line quoted values, this allows for
large chunks of marked up text to be embedded into a template:
\[[template id=foo name="Sally" color="green" age=8 notes=""" \[[template id=foo name="Sally" color="green" age=8 notes="""
* \[[Charley]]'s sister. * \[[Charley]]'s sister.
* "I want to be an astronaut when I grow up."
* Really 8 and a half. * Really 8 and a half.
* Wants to be an astronaut when she grows up.
"""]] """]]
To create a template, make a page in the wiki named `template/foo`. Note To create a template, make a page in the wiki named `template/foo`. Note
@ -31,6 +34,8 @@ for the full syntax, but all you really need to know are a few things:
* To insert the value of a variable, use `<TMPL_VAR variable>`. * To insert the value of a variable, use `<TMPL_VAR variable>`.
* To make a block of text conditional on a variable being set use * To make a block of text conditional on a variable being set use
`<TMPL_IF NAME="variable">text</TMPL_IF>`. `<TMPL_IF NAME="variable">text</TMPL_IF>`.
* To use one block of text if a variable is set and a second if it's not,
use `<TMPL_IF NAME="variable">text<TMPL_ELSE>other text</TMPL_IF>`
Here's a sample template: Here's a sample template:

View File

@ -0,0 +1,24 @@
Currently ikiwiki linkifies text, then runs preprocessor directives. This
allows a directive to contain a wikilink inside a parameter, but since the
wikilink expands to some arbitrary html, the parameter needs to be
triple-quoted to avoid quotes in the expanded text from leaking out. This
is rather non-obvious.
One fix would be to switch the order, since linkification and preprocessing
are relatively independant. Some directives, like inline, would need to keep
on linkifiying the inlined pages, to make the links be resolved correctly,
but that's ok. Any directives that outputed stuff that looked like a
wikilink, but wasn't, would need to be changed.
> This solution has been implemented and _seems_ ok.
An alternative would be to change the wikilink regexp so it doesn't apply
to wikilinks that are embedded inside preprocessor directives. I haven't
found a way to do that yet, since perl doesn't allow variable-width
negative lookbehind.
Maybe processing wikilinks and preprocessor directives
as part of the same loop would work, but that probably has its own
issues.
[[todo/done]]