X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/1bf21d2a375c7cf29c6e6436e253cf715717919c..f1f6973d2d05e2cfc7f463df8568de07314e1720:/IkiWiki/Plugin/rename.pm diff --git a/IkiWiki/Plugin/rename.pm b/IkiWiki/Plugin/rename.pm index 38cebdba5..537e91317 100644 --- a/IkiWiki/Plugin/rename.pm +++ b/IkiWiki/Plugin/rename.pm @@ -10,7 +10,7 @@ sub import { hook(type => "formbuilder_setup", id => "rename", call => \&formbuilder_setup); hook(type => "formbuilder", id => "rename", call => \&formbuilder); hook(type => "sessioncgi", id => "rename", call => \&sessioncgi); - hook(type => "rename", id => "rename", call => \&rename); + hook(type => "rename", id => "rename", call => \&rename_subpages); } sub getsetup () { @@ -18,6 +18,7 @@ sub getsetup () { plugin => { safe => 1, rebuild => 0, + section => "web", }, } @@ -49,7 +50,7 @@ sub check_canrename ($$$$$$) { IkiWiki::check_canedit($src, $q, $session); if ($attachment) { if (IkiWiki::Plugin::attachment->can("check_canattach")) { - IkiWiki::Plugin::attachment::check_canattach($session, $src, $srcfile); + IkiWiki::Plugin::attachment::check_canattach($session, $src, "$config{srcdir}/$srcfile"); } else { error("renaming of attachments is not allowed"); @@ -62,9 +63,8 @@ sub check_canrename ($$$$$$) { error(gettext("no change to the file name was specified")); } - # Must be a legal filename, and not absolute. - if (IkiWiki::file_pruned($destfile, $config{srcdir}) || - $destfile=~/^\//) { + # Must be a legal filename. + if (IkiWiki::file_pruned($destfile)) { error(sprintf(gettext("illegal name"))); } @@ -84,7 +84,7 @@ sub check_canrename ($$$$$$) { if ($attachment) { # Note that $srcfile is used here, not $destfile, # because it wants the current file, to check it. - IkiWiki::Plugin::attachment::check_canattach($session, $dest, $srcfile); + IkiWiki::Plugin::attachment::check_canattach($session, $dest, "$config{srcdir}/$srcfile"); } } @@ -126,7 +126,7 @@ sub rename_form ($$$) { javascript => 0, params => $q, action => $config{cgiurl}, - stylesheet => IkiWiki::baseurl()."style.css", + stylesheet => 1, fields => [qw{do page new_name attachment}], ); @@ -137,14 +137,16 @@ sub rename_form ($$$) { # insert the standard extensions my @page_types; if (exists $IkiWiki::hooks{htmlize}) { - @page_types=grep { !/^_/ } - keys %{$IkiWiki::hooks{htmlize}}; + foreach my $key (grep { !/^_/ } keys %{$IkiWiki::hooks{htmlize}}) { + push @page_types, [$key, $IkiWiki::hooks{htmlize}{$key}{longname} || $key]; + } } + @page_types=sort @page_types; # make sure the current extension is in the list my ($ext) = $pagesources{$page}=~/\.([^.]+)$/; if (! $IkiWiki::hooks{htmlize}{$ext}) { - unshift(@page_types, $ext); + unshift(@page_types, [$ext, $ext]); } $f->field(name => "type", type => 'select', @@ -233,6 +235,7 @@ sub formbuilder (@) { if (defined $form->field("do") && ($form->field("do") eq "edit" || $form->field("do") eq "create")) { + IkiWiki::decode_form_utf8($form); my $q=$params{cgi}; my $session=$params{session}; @@ -240,7 +243,7 @@ sub formbuilder (@) { rename_start($q, $session, 0, $form->field("page")); } elsif ($form->submitted eq "Rename Attachment") { - my @selected=$q->param("attachment_select"); + my @selected=map { Encode::decode_utf8($_) } $q->param("attachment_select"); if (@selected > 1) { error(gettext("Only one attachment can be renamed at a time.")); } @@ -276,7 +279,7 @@ sub sessioncgi ($$) { if ($q->param("do") eq 'rename') { my $session=shift; - my ($form, $buttons)=rename_form($q, $session, $q->param("page")); + my ($form, $buttons)=rename_form($q, $session, Encode::decode_utf8($q->param("page"))); IkiWiki::decode_form_utf8($form); if ($form->submitted eq 'Cancel') { @@ -288,9 +291,9 @@ sub sessioncgi ($$) { # These untaints are safe because of the checks # performed in check_canrename later. - my $src=$q->param("page"); + my $src=$form->field("page"); my $srcfile=IkiWiki::possibly_foolish_untaint($pagesources{$src}); - my $dest=IkiWiki::possibly_foolish_untaint(titlepage($q->param("new_name"))); + my $dest=IkiWiki::possibly_foolish_untaint(titlepage($form->field("new_name"))); my $destfile=$dest; if (! $q->param("attachment")) { my $type=$q->param('type'); @@ -318,8 +321,6 @@ sub sessioncgi ($$) { cgi => $q, session => $session, ); - # FIXME: remove duplicates (based on src or srcfile key) - # from @torename require IkiWiki::Render; IkiWiki::disable_commit_hook() if $config{rcs}; @@ -416,7 +417,7 @@ sub sessioncgi ($$) { } # Add subpages to the list of pages to be renamed, if needed. -sub rename(@) { +sub rename_subpages (@) { my %params = @_; my %torename = %{$params{torename}}; @@ -480,7 +481,7 @@ sub renamepage_hook ($$$$) { return $content; } -sub rename_hook (@) { +sub rename_hook { my %params = @_; my @torename=@{$params{torename}}; @@ -488,33 +489,34 @@ sub rename_hook (@) { my $q=$params{cgi}; my $session=$params{session}; + return () unless @torename; + my @nextset; - if (@torename) { - foreach my $torename (@torename) { - unless (exists $done{$torename->{src}} && $done{$torename->{src}}) { - IkiWiki::run_hooks(rename => sub { - push @nextset, shift->( - torename => $torename, - cgi => $q, - session => $session, - ); - }); - $done{$torename->{src}}=1; - } + foreach my $torename (@torename) { + unless (exists $done{$torename->{src}} && $done{$torename->{src}}) { + IkiWiki::run_hooks(rename => sub { + push @nextset, shift->( + torename => $torename, + cgi => $q, + session => $session, + ); + }); + $done{$torename->{src}}=1; } - push @torename, rename_hook( - torename => \@nextset, - done => \%done, - cgi => $q, - session => $session, - ); - return @torename; - } - else { - return (); } + + push @torename, rename_hook( + torename => \@nextset, + done => \%done, + cgi => $q, + session => $session, + ); + + # dedup + my %seen; + return grep { ! $seen{$_->{src}}++ } @torename; } - + sub do_rename ($$$) { my $rename=shift; my $q=shift; @@ -534,7 +536,7 @@ sub do_rename ($$$) { IkiWiki::rcs_rename($rename->{srcfile}, $rename->{destfile}); } else { - if (! CORE::rename($config{srcdir}."/".$rename->{srcfile}, + if (! rename($config{srcdir}."/".$rename->{srcfile}, $config{srcdir}."/".$rename->{destfile})) { error("rename: $!"); }