X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/c20c4066311341e332dc425023f856b6414de9ae..87a1d3ff8fb43d219c6f685600a103df43cef4c1:/IkiWiki/CGI.pm diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index cf6000314..424ce2c78 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -4,6 +4,8 @@ use warnings; use strict; use IkiWiki; use IkiWiki::UserInfo; +use open qw{:utf8 :std}; +use Encode; package IkiWiki; @@ -32,9 +34,14 @@ sub cgi_recentchanges ($) { #{{{ unlockwiki(); - my $template=HTML::Template->new( - filename => "$config{templatedir}/recentchanges.tmpl" - ); + # Optimisation: building recentchanges means calculating lots of + # links. Memoizing htmllink speeds it up a lot (can't be memoized + # during page builds as the return values may change, but they + # won't here.) + eval q{use Memoize}; + memoize("htmllink"); + + my $template=template("recentchanges.tmpl"); $template->param( title => "RecentChanges", indexlink => indexlink(), @@ -43,7 +50,7 @@ sub cgi_recentchanges ($) { #{{{ styleurl => styleurl(), baseurl => "$config{url}/", ); - print $q->header, $template->output; + print $q->header(-charset=>'utf-8'), $template->output; } #}}} sub cgi_signin ($$) { #{{{ @@ -55,6 +62,7 @@ sub cgi_signin ($$) { #{{{ title => "signin", fields => [qw(do title page subpage from name password confirm_password email)], header => 1, + charset => "utf-8", method => 'POST', validate => { confirm_password => { @@ -68,7 +76,7 @@ sub cgi_signin ($$) { #{{{ action => $config{cgiurl}, header => 0, template => (-e "$config{templatedir}/signin.tmpl" ? - "$config{templatedir}/signin.tmpl" : ""), + {template_params("signin.tmpl")} : ""), stylesheet => styleurl(), ); @@ -172,7 +180,7 @@ sub cgi_signin ($$) { #{{{ $form->field(name => "confirm_password", type => "hidden"); $form->field(name => "email", type => "hidden"); $form->text("Registration successful. Now you can Login."); - print $session->header(); + print $session->header(-charset=>'utf-8'); print misctemplate($form->title, $form->render(submit => ["Login"])); } else { @@ -181,9 +189,7 @@ sub cgi_signin ($$) { #{{{ } elsif ($form->submitted eq 'Mail Password') { my $user_name=$form->field("name"); - my $template=HTML::Template->new( - filename => "$config{templatedir}/passwordmail.tmpl" - ); + my $template=template("passwordmail.tmpl"); $template->param( user_name => $user_name, user_password => userinfo_get($user_name, "password"), @@ -202,12 +208,12 @@ sub cgi_signin ($$) { #{{{ $form->text("Your password has been emailed to you."); $form->field(name => "name", required => 0); - print $session->header(); + print $session->header(-charset=>'utf-8'); print misctemplate($form->title, $form->render(submit => ["Login", "Register", "Mail Password"])); } } else { - print $session->header(); + print $session->header(-charset=>'utf-8'); print misctemplate($form->title, $form->render(submit => ["Login", "Register", "Mail Password"])); } } #}}} @@ -222,6 +228,7 @@ sub cgi_prefs ($$) { #{{{ fields => [qw(do name password confirm_password email subscriptions locked_pages)], header => 0, + charset => "utf-8", method => 'POST', validate => { confirm_password => { @@ -234,7 +241,7 @@ sub cgi_prefs ($$) { #{{{ params => $q, action => $config{cgiurl}, template => (-e "$config{templatedir}/prefs.tmpl" ? - "$config{templatedir}/prefs.tmpl" : ""), + {template_params("prefs.tmpl")} : ""), stylesheet => styleurl(), ); my @buttons=("Save Preferences", "Logout", "Cancel"); @@ -281,7 +288,7 @@ sub cgi_prefs ($$) { #{{{ $form->text("Preferences saved."); } - print $session->header(); + print $session->header(-charset=>'utf-8'); print misctemplate($form->title, $form->render(submit => \@buttons)); } #}}} @@ -293,6 +300,7 @@ sub cgi_editpage ($$) { #{{{ my $form = CGI::FormBuilder->new( fields => [qw(do rcsinfo subpage from page editcontent comments)], header => 1, + charset => "utf-8", method => 'POST', validate => { editcontent => '/.+/', @@ -302,23 +310,27 @@ sub cgi_editpage ($$) { #{{{ params => $q, action => $config{cgiurl}, table => 0, - template => "$config{templatedir}/editpage.tmpl" + template => {template_params("editpage.tmpl")}, ); my @buttons=("Save Page", "Preview", "Cancel"); # This untaint is safe because titlepage removes any problimatic # characters. - my ($page)=titlepage(possibly_foolish_untaint(lc($form->param('page')))); + my ($page)=Encode::decode_utf8($form->param('page')); + $page=titlepage(possibly_foolish_untaint(lc($page))); if (! defined $page || ! length $page || $page=~/$config{wiki_file_prune_regexp}/ || $page=~/^\//) { error("bad page name"); } $page=lc($page); - my $file=$page.$config{default_pageext}; + my $file; if (exists $pagesources{lc($page)}) { $file=$pagesources{lc($page)}; } + else { + $file=$page.".".$config{default_pageext}; + } my $newfile=0; if (! -e "$config{srcdir}/$file") { $newfile=1; @@ -349,9 +361,17 @@ sub cgi_editpage ($$) { #{{{ } elsif ($form->submitted eq "Preview") { require IkiWiki::Render; + # Apparently FormBuilder doesn't not treat input as + # utf-8, so decode from it. + my $content = Encode::decode_utf8($form->field('editcontent')); + my $comments = Encode::decode_utf8($form->field('comments')); + $form->field(name => "editcontent", + value => $content, force => 1); + $form->field(name => "comments", + value => $comments, force => 1); $form->tmpl_param("page_preview", - htmlize($config{default_pageext}, - linkify($page, $page, $form->field('editcontent')))); + htmlize(pagetype($file), + linkify($page, $page, $content))); } else { $form->tmpl_param("page_preview", ""); @@ -431,13 +451,16 @@ sub cgi_editpage ($$) { #{{{ # save page page_locked($page, $session); - my $content=$form->field('editcontent'); + # Decode utf-8 since FormBuilder does not + my $content=Encode::decode_utf8($form->field('editcontent')); + $content=~s/\r\n/\n/g; $content=~s/\r/\n/g; writefile($file, $config{srcdir}, $content); my $message="web commit "; - if (length $session->param("name")) { + if (defined $session->param("name") && + length $session->param("name")) { $message.="by ".$session->param("name"); } else { @@ -445,7 +468,7 @@ sub cgi_editpage ($$) { #{{{ } if (defined $form->field('comments') && length $form->field('comments')) { - $message.=": ".$form->field('comments'); + $message.=": ".Encode::decode_utf8($form->field('comments')); } if ($config{rcs}) { @@ -464,6 +487,7 @@ sub cgi_editpage ($$) { #{{{ force => 1); $form->tmpl_param("page_conflict", 1); $form->field("editcontent", value => $conflict, force => 1); + $form->field(name => "comments", value => Encode::decode_utf8($form->field('comments')), force => 1); $form->field("do", "edit)"); $form->tmpl_param("page_select", 0); $form->field(name => "page", type => 'hidden');