From d4ca3b3f50027d0dfd052f77ddcc4290ab0e6a81 Mon Sep 17 00:00:00 2001 From: joey Date: Wed, 23 Aug 2006 20:23:57 +0000 Subject: [PATCH] * 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. --- IkiWiki/CGI.pm | 6 ++++- IkiWiki/Plugin/inline.pm | 4 +-- IkiWiki/Plugin/sidebar.pm | 2 +- IkiWiki/Render.pm | 27 ++++++++++++++----- debian/changelog | 12 +++++++-- doc/plugins/template.mdwn | 15 +++++++---- .../linkify_and_preprocessor_ordering.mdwn | 24 +++++++++++++++++ 7 files changed, 72 insertions(+), 18 deletions(-) create mode 100644 doc/todo/linkify_and_preprocessor_ordering.mdwn diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index 7d4ba146f..120e2fdee 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -411,8 +411,12 @@ sub cgi_editpage ($$) { #{{{ value => $content, force => 1); $form->field(name => "comments", value => $comments, force => 1); + $config{rss}=0; # avoid preview writing an rss feed! $form->tmpl_param("page_preview", - htmlize($type, linkify($page, "", filter($page, $content)))); + htmlize($type, + linkify($page, "", + preprocess($page, $page, + filter($page, $content))))); } else { $form->tmpl_param("page_preview", ""); diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm index 935b86b58..c712f7bb4 100644 --- a/IkiWiki/Plugin/inline.pm +++ b/IkiWiki/Plugin/inline.pm @@ -116,8 +116,8 @@ sub preprocess_inline (@) { #{{{ my $type=pagetype($file); if (defined $type) { $ret.="\n". - preprocess($page, $params{page}, linkify($page, $params{page}, + preprocess($page, $params{page}, filter($page, readfile(srcfile($file))))); } @@ -145,8 +145,8 @@ sub get_inline_content ($$) { #{{{ my $type=pagetype($file); if (defined $type) { return htmlize($type, - preprocess($page, $destpage, linkify($page, $destpage, + preprocess($page, $destpage, filter($page, readfile(srcfile($file)))))); } diff --git a/IkiWiki/Plugin/sidebar.pm b/IkiWiki/Plugin/sidebar.pm index a68f5e1da..e0e81526f 100644 --- a/IkiWiki/Plugin/sidebar.pm +++ b/IkiWiki/Plugin/sidebar.pm @@ -29,8 +29,8 @@ sub sidebar_content ($) { #{{{ my $content=IkiWiki::readfile(IkiWiki::srcfile($sidebar_file)); return unless length $content; return IkiWiki::htmlize($sidebar_type, - IkiWiki::preprocess($sidebar_page, $page, IkiWiki::linkify($sidebar_page, $page, + IkiWiki::preprocess($sidebar_page, $page, IkiWiki::filter($sidebar_page, $content)))); } diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index 5351ee7ad..cef770c67 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -104,11 +104,24 @@ sub preprocess ($$$;$) { #{{{ # Note: preserve order of params, some plugins may # consider it significant. my @params; - while ($params =~ /(?:(\w+)=)?(?:"""\n?(.+)"""|"([^"]+)"|(\S+))(?:\s+|$)/sg) { - my $val=(defined $2 ? $2 : (defined $3 ? $3 : $4)); - chomp $val; - if (defined $1) { - push @params, $1, $val; + while ($params =~ /(?:(\w+)=)?(?:"""(.*?)"""|"([^"]+)"|(\S+))(?:\s+|$)/sg) { + my $key=$1; + my $val; + if (defined $2) { + $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 { 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; } #}}} @@ -268,8 +281,8 @@ sub render ($) { #{{{ $links{$page}=[findlinks($page, $content)]; - $content=linkify($page, $page, $content); $content=preprocess($page, $page, $content); + $content=linkify($page, $page, $content); $content=htmlize($type, $content); check_overwrite("$config{destdir}/".htmlpage($page), $page); diff --git a/debian/changelog b/debian/changelog index 0d0b74d05..7931dc98a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -16,8 +16,16 @@ ikiwiki (1.22) UNRELEASED; urgency=low * Make pagespec merge code smarter about merging duplicate pagespecs. * Patch from Jordà Polo to make Setup::Standard support hashes in config files. - - -- Joey Hess Wed, 23 Aug 2006 14:35:18 -0400 + * 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 Wed, 23 Aug 2006 15:30:09 -0400 ikiwiki (1.21) unstable; urgency=low diff --git a/doc/plugins/template.mdwn b/doc/plugins/template.mdwn index 9e2ab0891..6f38e554e 100644 --- a/doc/plugins/template.mdwn +++ b/doc/plugins/template.mdwn @@ -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` 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 -allowed in the wiki page outside the template. Combined with multi-line -quoted values, this allows for large chunks of marked up text to be -embedded into a template: +(Note that if the template doesn't exist, the page will provide a link that +can be used to create it.) + +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=""" * \[[Charley]]'s sister. + * "I want to be an astronaut when I grow up." * 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 @@ -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 ``. * To make a block of text conditional on a variable being set use `text`. +* To use one block of text if a variable is set and a second if it's not, + use `textother text` Here's a sample template: diff --git a/doc/todo/linkify_and_preprocessor_ordering.mdwn b/doc/todo/linkify_and_preprocessor_ordering.mdwn new file mode 100644 index 000000000..2936d74f0 --- /dev/null +++ b/doc/todo/linkify_and_preprocessor_ordering.mdwn @@ -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]] -- 2.39.2