Improved handling of wikilinks containing characters that are not allowed

in filenames. Now converts to valid filenames automatically.

Note, need to --refresh your wiki after updating to this version, if you
use any pages with __nn__ in their names.
master
joey 2006-03-29 02:14:55 +00:00
parent f6b33b8772
commit 0a95ac2144
5 changed files with 17 additions and 23 deletions

View File

@ -294,8 +294,10 @@ sub cgi_editpage ($$) { #{{{
); );
my @buttons=("Save Page", "Preview", "Cancel"); my @buttons=("Save Page", "Preview", "Cancel");
my ($page)=$form->param('page')=~/$config{wiki_file_regexp}/; # This untaint is safe because titlepage removes any problimatic
if (! defined $page || ! length $page || $page ne $q->param('page') || # characters.
my ($page)=titlepage(possibly_foolish_untaint(lc($form->param('page'))));
if (! defined $page || ! length $page ||
$page=~/$config{wiki_file_prune_regexp}/ || $page=~/^\//) { $page=~/$config{wiki_file_prune_regexp}/ || $page=~/^\//) {
error("bad page name"); error("bad page name");
} }
@ -364,7 +366,7 @@ sub cgi_editpage ($$) { #{{{
my $dir=$from."/"; my $dir=$from."/";
$dir=~s![^/]+/$!!; $dir=~s![^/]+/$!!;
if (length $form->param('subpage') || if ((defined $form->param('subpage') && length $form->param('subpage')) ||
$page eq 'discussion') { $page eq 'discussion') {
$best_loc="$from/$page"; $best_loc="$from/$page";
} }
@ -511,12 +513,8 @@ sub cgi () { #{{{
cgi_prefs($q, $session); cgi_prefs($q, $session);
} }
elsif ($do eq 'blog') { elsif ($do eq 'blog') {
# munge page name to be valid, no matter what freeform text my $page=titlepage(lc($q->param('title')));
# is entered # if the page already exists, munge it to be unique
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 $from=$q->param('from'); my $from=$q->param('from');
my $add=""; my $add="";
while (exists $oldpagemtime{"$from/$page$add"}) { while (exists $oldpagemtime{"$from/$page$add"}) {

View File

@ -9,8 +9,8 @@ sub linkify ($$) { #{{{
my $page=shift; my $page=shift;
$content =~ s{(\\?)$config{wiki_link_regexp}}{ $content =~ s{(\\?)$config{wiki_link_regexp}}{
$2 ? ( $1 ? "[[$2|$3]]" : htmllink($page, $3, 0, 0, pagetitle($2))) $2 ? ( $1 ? "[[$2|$3]]" : htmllink($page, titlepage($3), 0, 0, pagetitle($2)))
: ( $1 ? "[[$3]]" : htmllink($page, $3)) : ( $1 ? "[[$3]]" : htmllink($page, titlepage($3)))
}eg; }eg;
return $content; return $content;
@ -325,7 +325,7 @@ sub findlinks ($$) { #{{{
my @links; my @links;
while ($content =~ /(?<!\\)$config{wiki_link_regexp}/g) { 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 # Discussion links are a special case since they're not in the text
# of the page, but on its template. # of the page, but on its template.

View File

@ -1 +0,0 @@
test

View File

@ -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 WikiLinks can be entered in any case you like, the page they link to is
always lowercased. 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 Note that if the file linked to by a WikiLink looks like an image, it will
be displayed inline on the page. be displayed inline on the page.

View File

@ -252,6 +252,13 @@ sub pagetitle ($) { #{{{
return $page; return $page;
} #}}} } #}}}
sub titlepage ($) { #{{{
my $title=shift;
$title=~y/ /_/;
$title=~s/([^-A-Za-z0-9_:+\/])/"__".ord($1)."__"/eg;
return $title;
} #}}}
sub htmllink ($$;$$$) { #{{{ sub htmllink ($$;$$$) { #{{{
my $page=shift; my $page=shift;
my $link=shift; my $link=shift;