]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/CGI.pm
remove maxdepth, it can be accomplished by pagespec like ".. and !*/*/*/*"
[git.ikiwiki.info.git] / IkiWiki / CGI.pm
index ef5244145fcba64f14327494977576c12eafecf7..f1f83cfc41e3c3a49215ca7ea7f8768b0c552211 100644 (file)
@@ -31,7 +31,7 @@ sub page_locked ($$;$) { #{{{
 
        foreach my $admin (@{$config{adminuser}}) {
                my $locked_pages=userinfo_get($admin, "locked_pages");
-               if (globlist_match($page, userinfo_get($admin, "locked_pages"))) {
+               if (pagespec_match($page, userinfo_get($admin, "locked_pages"))) {
                        return 1 if $nonfatal;
                        error(htmllink("", "", $page, 1)." is locked by ".
                              htmllink("", "", $admin, 1)." and cannot be edited.");
@@ -102,6 +102,8 @@ sub cgi_signin ($$) { #{{{
                             {template_params("signin.tmpl")} : ""),
                stylesheet => styleurl(),
        );
+               
+       decode_form_utf8($form);
        
        $form->field(name => "name", required => 0);
        $form->field(name => "do", type => "hidden");
@@ -112,13 +114,11 @@ sub cgi_signin ($$) { #{{{
        $form->field(name => "password", type => "password", required => 0);
        $form->field(name => "confirm_password", type => "password", required => 0);
        $form->field(name => "email", required => 0);
-       if ($q->param("do") ne "signin") {
+       if ($q->param("do") ne "signin" && !$form->submitted) {
                $form->text("You need to log in first.");
        }
        
        if ($form->submitted) {
-               decode_form_utf8($form);
-
                # Set required fields based on how form was submitted.
                my %required=(
                        "Login" => [qw(name password)],
@@ -278,9 +278,9 @@ sub cgi_prefs ($$) { #{{{
        $form->field(name => "password", type => "password");
        $form->field(name => "confirm_password", type => "password");
        $form->field(name => "subscriptions", size => 50,
-               comment => "(".htmllink("", "", "GlobList", 1).")");
+               comment => "(".htmllink("", "", "PageSpec", 1).")");
        $form->field(name => "locked_pages", size => 50,
-               comment => "(".htmllink("", "", "GlobList", 1).")");
+               comment => "(".htmllink("", "", "PageSpec", 1).")");
        
        if (! is_admin($user_name)) {
                $form->field(name => "locked_pages", type => "hidden");
@@ -325,7 +325,7 @@ sub cgi_editpage ($$) { #{{{
 
        eval q{use CGI::FormBuilder};
        my $form = CGI::FormBuilder->new(
-               fields => [qw(do rcsinfo subpage from page editcontent comments)],
+               fields => [qw(do rcsinfo subpage from page type editcontent comments)],
                header => 1,
                charset => "utf-8",
                method => 'POST',
@@ -346,20 +346,36 @@ sub cgi_editpage ($$) { #{{{
        # This untaint is safe because titlepage removes any problematic
        # characters.
        my ($page)=$form->field('page');
-       $page=titlepage(possibly_foolish_untaint(lc($page)));
+       $page=titlepage(possibly_foolish_untaint($page));
        if (! defined $page || ! length $page ||
            $page=~/$config{wiki_file_prune_regexp}/ || $page=~/^\//) {
                error("bad page name");
        }
-       $page=lc($page);
+       
+       my $from;
+       if (defined $form->field('from')) {
+               ($from)=$form->field('from')=~/$config{wiki_file_regexp}/;
+       }
        
        my $file;
-       if (exists $pagesources{lc($page)}) {
-               $file=$pagesources{lc($page)};
+       my $type;
+       if (exists $pagesources{$page}) {
+               $file=$pagesources{$page};
+               $type=pagetype($file);
        }
        else {
-               $file=$page.".".$config{default_pageext};
+               $type=$form->param('type');
+               if (defined $type && length $type && $hooks{htmlize}{$type}) {
+                       $type=possibly_foolish_untaint($type);
+               }
+               elsif (defined $from) {
+                       # favor the type of linking page
+                       $type=pagetype($pagesources{$from});
+               }
+               $type=$config{default_pageext} unless defined $type;
+               $file=$page.".".$type;
        }
+
        my $newfile=0;
        if (! -e "$config{srcdir}/$file") {
                $newfile=1;
@@ -369,7 +385,8 @@ sub cgi_editpage ($$) { #{{{
        $form->field(name => "from", type => 'hidden');
        $form->field(name => "rcsinfo", type => 'hidden');
        $form->field(name => "subpage", type => 'hidden');
-       $form->field(name => "page", value => "$page", force => 1);
+       $form->field(name => "page", value => $page, force => 1);
+       $form->field(name => "type", value => $type, force => 1);
        $form->field(name => "comments", type => "text", size => 80);
        $form->field(name => "editcontent", type => "textarea", rows => 20,
                cols => 80);
@@ -397,8 +414,7 @@ sub cgi_editpage ($$) { #{{{
                $form->field(name => "comments",
                                value => $comments, force => 1);
                $form->tmpl_param("page_preview",
-                       htmlize(pagetype($file),
-                               linkify($page, $page, $content)));
+                       htmlize($type, linkify($page, $page, filter($page, $content))));
        }
        else {
                $form->tmpl_param("page_preview", "");
@@ -410,7 +426,6 @@ sub cgi_editpage ($$) { #{{{
                if ($form->field("do") eq "create") {
                        my @page_locs;
                        my $best_loc;
-                       my ($from)=$form->field('from')=~/$config{wiki_file_regexp}/;
                        if (! defined $from || ! length $from ||
                            $from ne $form->field('from') ||
                            $from=~/$config{wiki_file_prune_regexp}/ ||
@@ -439,7 +454,7 @@ sub cgi_editpage ($$) { #{{{
                        }
 
                        @page_locs = grep {
-                               ! exists $pagesources{lc($_)} &&
+                               ! exists $pagecase{lc $_} &&
                                ! page_locked($_, $session, 1)
                        } @page_locs;
                        
@@ -449,10 +464,17 @@ sub cgi_editpage ($$) { #{{{
                                redirect($q, "$config{url}/".htmlpage($page));
                                return;
                        }
-                               
+                       
+                       my @page_types;
+                       if (exists $hooks{htmlize}) {
+                               @page_types=keys %{$hooks{htmlize}};
+                       }
+                       
                        $form->tmpl_param("page_select", 1);
                        $form->field(name => "page", type => 'select',
                                options => \@page_locs, value => $best_loc);
+                       $form->field(name => "type", type => 'select',
+                               options => \@page_types);
                        $form->title("creating ".pagetitle($page));
                }
                elsif ($form->field("do") eq "edit") {
@@ -460,8 +482,8 @@ sub cgi_editpage ($$) { #{{{
                        if (! defined $form->field('editcontent') || 
                            ! length $form->field('editcontent')) {
                                my $content="";
-                               if (exists $pagesources{lc($page)}) {
-                                       $content=readfile(srcfile($pagesources{lc($page)}));
+                               if (exists $pagesources{$page}) {
+                                       $content=readfile(srcfile($pagesources{$page}));
                                        $content=~s/\n/\r\n/g;
                                }
                                $form->field(name => "editcontent", value => $content,
@@ -469,6 +491,7 @@ sub cgi_editpage ($$) { #{{{
                        }
                        $form->tmpl_param("page_select", 0);
                        $form->field(name => "page", type => 'hidden');
+                       $form->field(name => "type", type => 'hidden');
                        $form->title("editing ".pagetitle($page));
                }
                
@@ -517,6 +540,7 @@ sub cgi_editpage ($$) { #{{{
                                $form->field("do", "edit)");
                                $form->tmpl_param("page_select", 0);
                                $form->field(name => "page", type => 'hidden');
+                               $form->field(name => "type", type => 'hidden');
                                $form->title("editing $page");
                                print $form->render(submit => \@buttons);
                                return;
@@ -540,11 +564,7 @@ sub cgi () { #{{{
        
        my $q=CGI->new;
        
-       if (exists $hooks{cgi}) {
-               foreach my $id (keys %{$hooks{cgi}}) {
-                       $hooks{cgi}{$id}{call}->($q);
-               }
-       }
+       run_hooks(cgi => sub { shift->($q) });
        
        my $do=$q->param('do');
        if (! defined $do || ! length $do) {
@@ -594,11 +614,11 @@ sub cgi () { #{{{
                cgi_prefs($q, $session);
        }
        elsif ($do eq 'blog') {
-               my $page=titlepage(lc($q->param('title')));
+               my $page=titlepage($q->param('title'));
                # if the page already exists, munge it to be unique
                my $from=$q->param('from');
                my $add="";
-               while (exists $oldpagemtime{"$from/$page$add"}) {
+               while (exists $pagecase{lc "$from/$page$add"}) {
                        $add=1 unless length $add;
                        $add++;
                }