diff options
-rw-r--r-- | IkiWiki/CGI.pm | 16 | ||||
-rw-r--r-- | IkiWiki/Render.pm | 6 | ||||
-rw-r--r-- | doc/foo___40__1975-__41__.mdwn | 1 | ||||
-rw-r--r-- | doc/wikilink.mdwn | 10 | ||||
-rwxr-xr-x | ikiwiki | 7 |
5 files changed, 17 insertions, 23 deletions
diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index fb4fd4475..7c12bee5b 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -294,8 +294,10 @@ sub cgi_editpage ($$) { #{{{ ); my @buttons=("Save Page", "Preview", "Cancel"); - my ($page)=$form->param('page')=~/$config{wiki_file_regexp}/; - if (! defined $page || ! length $page || $page ne $q->param('page') || + # This untaint is safe because titlepage removes any problimatic + # characters. + my ($page)=titlepage(possibly_foolish_untaint(lc($form->param('page')))); + if (! defined $page || ! length $page || $page=~/$config{wiki_file_prune_regexp}/ || $page=~/^\//) { error("bad page name"); } @@ -364,7 +366,7 @@ sub cgi_editpage ($$) { #{{{ my $dir=$from."/"; $dir=~s![^/]+/$!!; - if (length $form->param('subpage') || + if ((defined $form->param('subpage') && length $form->param('subpage')) || $page eq 'discussion') { $best_loc="$from/$page"; } @@ -511,12 +513,8 @@ sub cgi () { #{{{ cgi_prefs($q, $session); } elsif ($do eq 'blog') { - # munge page name to be valid, no matter what freeform text - # is entered - my $page=lc($q->param('title')); - $page=~y/ /_/; - $page=~s/([^-A-Za-z0-9_:+\/])/"__".ord($1)."__"/eg; - # if the page already exist, munge it to be unique + my $page=titlepage(lc($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"}) { diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index 504edc843..f897b9b13 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -9,8 +9,8 @@ sub linkify ($$) { #{{{ my $page=shift; $content =~ s{(\\?)$config{wiki_link_regexp}}{ - $2 ? ( $1 ? "[[$2|$3]]" : htmllink($page, $3, 0, 0, pagetitle($2))) - : ( $1 ? "[[$3]]" : htmllink($page, $3)) + $2 ? ( $1 ? "[[$2|$3]]" : htmllink($page, titlepage($3), 0, 0, pagetitle($2))) + : ( $1 ? "[[$3]]" : htmllink($page, titlepage($3))) }eg; return $content; @@ -325,7 +325,7 @@ sub findlinks ($$) { #{{{ my @links; while ($content =~ /(?<!\\)$config{wiki_link_regexp}/g) { - push @links, lc($2); + push @links, titlepage($2); } # Discussion links are a special case since they're not in the text # of the page, but on its template. diff --git a/doc/foo___40__1975-__41__.mdwn b/doc/foo___40__1975-__41__.mdwn deleted file mode 100644 index 30d74d258..000000000 --- a/doc/foo___40__1975-__41__.mdwn +++ /dev/null @@ -1 +0,0 @@ -test
\ No newline at end of file diff --git a/doc/wikilink.mdwn b/doc/wikilink.mdwn index 25c758613..6051fe120 100644 --- a/doc/wikilink.mdwn +++ b/doc/wikilink.mdwn @@ -11,16 +11,6 @@ play when linking between [[SubPage]]s. WikiLinks can be entered in any case you like, the page they link to is always lowercased. -While a WikiLink is limited to alphanumerics and only a few special -charaters, it is possible to create page names containing other characters: - -* To display a page name with a space in it, use "\_" in the WikiLink, for - example, "\[[Multi\_Word\_Page\_Name]]". -* For any other special character, you can use "\_\__nnnn_\_\_" where - _nnnn_ is the unicode character number. For example, - "\[[This\_page\_name\_is\_\_44\_\_\_uselessly\_\_44\_\_\_a\_complete\_sentence\_\_46\_\_]]" - Limiting use of this to when you really need it is a good idea. - Note that if the file linked to by a WikiLink looks like an image, it will be displayed inline on the page. @@ -252,6 +252,13 @@ sub pagetitle ($) { #{{{ return $page; } #}}} +sub titlepage ($) { #{{{ + my $title=shift; + $title=~y/ /_/; + $title=~s/([^-A-Za-z0-9_:+\/])/"__".ord($1)."__"/eg; + return $title; +} #}}} + sub htmllink ($$;$$$) { #{{{ my $page=shift; my $link=shift; |