When editing a page, it would help to have a "preview changes" or "show diff" button, which brings up a diff from the current page content to the proposed new page content. --[[JoshTriplett]] Some discussion from the main [[/index/discussion]] page: >It would be nice to be able to have a button to show "Differences" (or "Show Diff") when >editing a page. Is that an option that can be enabled? > >> It's doable, it could even be done by a [[todo/plugin]], I think. >> --[[Joey]] --- I need help with this. Supposedly, such a plugin would provide a `formbuilder_setup` hook which would add the button, and a cgi hook which would interecept "Show Diff" clicks. This would show a diff between `titlepage(possibly_foolish_untaint($form->field("page")))` and the provided `$form->field("editcontent")`. But: * How could the case of concurrent editing be handled ? Especially as (I think) only the RCS backend can know that this has happened. * May I hijack the `page_preview` template variable to show my diff output? (the patch below assumes this). * Using the formbuilder hook to add a button, and coerce `editpage()` into showing the edit form again rather that saving the page needs the following patch. (note that this is not the only template which has its submit buttons hardcoded; is this supposed to work around something?)
Index: templates/editpage.tmpl
===================================================================
--- templates/editpage.tmpl     (révision 4130)
+++ templates/editpage.tmpl     (copie de travail)
@@ -57,9 +57,7 @@
 Optional comment about this change:

- - - + Index: IkiWiki/CGI.pm =================================================================== --- IkiWiki/CGI.pm (révision 4130) +++ IkiWiki/CGI.pm (copie de travail) @@ -304,6 +304,7 @@ eval q{use CGI::FormBuilder}; error($@) if $@; my $form = CGI::FormBuilder->new( + title => "editpage", fields => \@fields, charset => "utf-8", method => 'POST', @@ -321,7 +322,8 @@ ); run_hooks(formbuilder_setup => sub { - shift->(form => $form, cgi => $q, session => $session); + shift->(form => $form, cgi => $q, session => $session, + buttons => \@buttons); }); decode_form_utf8($form); @@ -402,12 +404,12 @@ preprocess($page, $page, filter($page, $page, $form->field('editcontent')), 0, 1)))); } - else { + elsif ($form->submitted eq "Save Page") { $form->tmpl_param("page_preview", ""); } $form->tmpl_param("page_conflict", ""); - if (! $form->submitted || $form->submitted eq "Preview" || + if ($form->submitted ne "Save Page" || ! $form->validate) { if ($form->field("do") eq "create") { my @page_locs;
--[[JeremieKoenig]]