diff options
29 files changed, 282 insertions, 71 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm index c06751dd3..97946bfcf 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -501,6 +501,12 @@ sub defaultconfig () { return @ret; } +# URL to top of wiki as a path starting with /, valid from any wiki page or +# the CGI; if that's not possible, an absolute URL. Either way, it ends with / +my $local_url; +# URL to CGI script, similar to $local_url +my $local_cgiurl; + sub checkconfig () { # locale stuff; avoid LC_ALL since it overrides everything if (defined $ENV{LC_ALL}) { @@ -537,7 +543,33 @@ sub checkconfig () { if ($config{cgi} && ! length $config{url}) { error(gettext("Must specify url to wiki with --url when using --cgi")); } - + + if (length $config{url}) { + eval q{use URI}; + my $baseurl = URI->new($config{url}); + + $local_url = $baseurl->path . "/"; + $local_cgiurl = undef; + + if (length $config{cgiurl}) { + my $cgiurl = URI->new($config{cgiurl}); + + $local_cgiurl = $cgiurl->path; + + if ($cgiurl->scheme ne $baseurl->scheme or + $cgiurl->authority ne $baseurl->authority) { + # too far apart, fall back to absolute URLs + $local_url = "$config{url}/"; + $local_cgiurl = $config{cgiurl}; + } + } + + $local_url =~ s{//$}{/}; + } + else { + $local_cgiurl = $config{cgiurl}; + } + $config{wikistatedir}="$config{srcdir}/.ikiwiki" unless exists $config{wikistatedir} && defined $config{wikistatedir}; @@ -1010,11 +1042,17 @@ sub linkpage ($) { sub cgiurl (@) { my %params=@_; - my $cgiurl=$config{cgiurl}; + my $cgiurl=$local_cgiurl; + if (exists $params{cgiurl}) { $cgiurl=$params{cgiurl}; delete $params{cgiurl}; } + + unless (%params) { + return $cgiurl; + } + return $cgiurl."?". join("&", map $_."=".uri_escape_utf8($params{$_}), keys %params); } @@ -1022,7 +1060,7 @@ sub cgiurl (@) { sub baseurl (;$) { my $page=shift; - return "$config{url}/" if ! defined $page; + return $local_url if ! defined $page; $page=htmlpage($page); $page=~s/[^\/]+$//; @@ -1096,7 +1134,7 @@ sub beautify_urlpath ($) { return $url; } -sub urlto ($$;$) { +sub urlto ($;$$) { my $to=shift; my $from=shift; my $absolute=shift; @@ -1113,6 +1151,12 @@ sub urlto ($$;$) { return $config{url}.beautify_urlpath("/".$to); } + if (! defined $from) { + my $u = $local_url; + $u =~ s{/$}{}; + return $u.beautify_urlpath("/".$to); + } + my $link = abs2rel($to, dirname(htmlpage($from))); return beautify_urlpath($link); diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index f2a32a958..ede194ff9 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -12,7 +12,7 @@ use Encode; sub printheader ($) { my $session=shift; - if ($config{sslcookie}) { + if ($ENV{HTTPS} || $config{sslcookie}) { print $session->header(-charset => 'utf-8', -cookie => $session->cookie(-httponly => 1, -secure => 1)); } @@ -116,7 +116,7 @@ sub cgi_signin ($$;$) { required => 'NONE', javascript => 0, params => $q, - action => $config{cgiurl}, + action => cgiurl(), header => 0, template => {type => 'div'}, stylesheet => 1, @@ -198,7 +198,7 @@ sub cgi_prefs ($$) { required => 'NONE', javascript => 0, params => $q, - action => $config{cgiurl}, + action => cgiurl(), template => {type => 'div'}, stylesheet => 1, fieldsets => [ @@ -231,11 +231,11 @@ sub cgi_prefs ($$) { if ($form->submitted eq 'Logout') { $session->delete(); - redirect($q, $config{url}); + redirect($q, baseurl(undef)); return; } elsif ($form->submitted eq 'Cancel') { - redirect($q, $config{url}); + redirect($q, baseurl(undef)); return; } elsif ($form->submitted eq 'Save Preferences' && $form->validate) { diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm index a39dab36c..68ac4cfae 100644 --- a/IkiWiki/Plugin/comments.pm +++ b/IkiWiki/Plugin/comments.pm @@ -237,7 +237,7 @@ sub preprocess { } if ($params{page} =~ m/\/\Q$config{comments_pagename}\E\d+_/) { - $pagestate{$page}{meta}{permalink} = urlto(IkiWiki::dirname($params{page}), undef, 1). + $pagestate{$page}{meta}{permalink} = urlto(IkiWiki::dirname($params{page})). "#".page_to_id($params{page}); } @@ -301,7 +301,7 @@ sub editcomment ($$) { required => [qw{editcontent}], javascript => 0, params => $cgi, - action => $config{cgiurl}, + action => IkiWiki::cgiurl(), header => 0, table => 0, template => { template('editcomment.tmpl') }, @@ -372,7 +372,7 @@ sub editcomment ($$) { error(gettext("bad page name")); } - my $baseurl = urlto($page, undef, 1); + my $baseurl = urlto($page); $form->title(sprintf(gettext("commenting on %s"), IkiWiki::pagetitle($page))); @@ -385,8 +385,7 @@ sub editcomment ($$) { if ($form->submitted eq CANCEL) { # bounce back to the page they wanted to comment on, and exit. - # CANCEL need not be considered in future - IkiWiki::redirect($cgi, urlto($page, undef, 1)); + IkiWiki::redirect($cgi, $baseurl); exit; } @@ -552,7 +551,7 @@ sub editcomment ($$) { # Jump to the new comment on the page. # The trailing question mark tries to avoid broken # caches and get the most recent version of the page. - IkiWiki::redirect($cgi, urlto($page, undef, 1). + IkiWiki::redirect($cgi, urlto($page). "?updated#".page_to_id($location)); } @@ -656,6 +655,7 @@ sub commentmoderation ($$) { $template->param( sid => $session->id, comments => \@comments, + cgiurl => IkiWiki::cgiurl(), ); IkiWiki::printheader($session); my $out=$template->output; @@ -810,14 +810,14 @@ sub pagetemplate (@) { if ($shown) { if ($template->query(name => 'commentsurl')) { $template->param(commentsurl => - urlto($page, undef, 1).'#comments'); + urlto($page).'#comments'); } if ($template->query(name => 'atomcommentsurl') && $config{usedirs}) { # This will 404 until there are some comments, but I # think that's probably OK... $template->param(atomcommentsurl => - urlto($page, undef, 1).'comments.atom'); + urlto($page).'comments.atom'); } if ($template->query(name => 'commentslink')) { diff --git a/IkiWiki/Plugin/editpage.pm b/IkiWiki/Plugin/editpage.pm index 1a04a72b5..da071d492 100644 --- a/IkiWiki/Plugin/editpage.pm +++ b/IkiWiki/Plugin/editpage.pm @@ -75,7 +75,7 @@ sub cgi_editpage ($$) { required => [qw{editcontent}], javascript => 0, params => $q, - action => $config{cgiurl}, + action => IkiWiki::cgiurl(), header => 0, table => 0, template => { template("editpage.tmpl") }, @@ -98,7 +98,7 @@ sub cgi_editpage ($$) { error(gettext("bad page name")); } - my $baseurl = urlto($page, undef, 1); + my $baseurl = urlto($page); my $from; if (defined $form->field('from')) { @@ -156,13 +156,13 @@ sub cgi_editpage ($$) { my $previewing=0; if ($form->submitted eq "Cancel") { if ($form->field("do") eq "create" && defined $from) { - redirect($q, urlto($from, undef, 1)); + redirect($q, urlto($from)); } elsif ($form->field("do") eq "create") { - redirect($q, $config{url}); + redirect($q, baseurl(undef)); } else { - redirect($q, urlto($page, undef, 1)); + redirect($q, $baseurl); } exit; } @@ -262,7 +262,7 @@ sub cgi_editpage ($$) { @page_locs=$page; } else { - redirect($q, urlto($page, undef, 1)); + redirect($q, $baseurl); exit; } } @@ -434,7 +434,7 @@ sub cgi_editpage ($$) { else { # The trailing question mark tries to avoid broken # caches and get the most recent version of the page. - redirect($q, urlto($page, undef, 1)."?updated"); + redirect($q, $baseurl."?updated"); } } diff --git a/IkiWiki/Plugin/goto.pm b/IkiWiki/Plugin/goto.pm index 348a663ef..0eb83fc20 100644 --- a/IkiWiki/Plugin/goto.pm +++ b/IkiWiki/Plugin/goto.pm @@ -64,7 +64,7 @@ sub cgi_goto ($;$) { ) } else { - IkiWiki::redirect($q, urlto($link, undef, 1)); + IkiWiki::redirect($q, urlto($link)); } exit; diff --git a/IkiWiki/Plugin/img.pm b/IkiWiki/Plugin/img.pm index bd527c8c8..103f6b2b3 100644 --- a/IkiWiki/Plugin/img.pm +++ b/IkiWiki/Plugin/img.pm @@ -152,8 +152,8 @@ sub preprocess (@) { $imgurl=urlto($imglink, $params{destpage}); } else { - $fileurl="$config{url}/$file"; - $imgurl="$config{url}/$imglink"; + $fileurl=urlto($file); + $imgurl=urlto($imglink); } if (! exists $params{class}) { diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm index 1fe40a5ea..765271564 100644 --- a/IkiWiki/Plugin/inline.pm +++ b/IkiWiki/Plugin/inline.pm @@ -300,7 +300,7 @@ sub preprocess_inline (@) { IkiWiki->can("cgi_editpage")) { # Add a blog post form, with feed buttons. my $formtemplate=template_depends("blogpost.tmpl", $params{page}, blind_cache => 1); - $formtemplate->param(cgiurl => $config{cgiurl}); + $formtemplate->param(cgiurl => IkiWiki::cgiurl()); $formtemplate->param(rootpage => rootpage(%params)); $formtemplate->param(rssurl => $rssurl) if $feeds && $rss; $formtemplate->param(atomurl => $atomurl) if $feeds && $atom; diff --git a/IkiWiki/Plugin/openid.pm b/IkiWiki/Plugin/openid.pm index fae9fb77f..0220a3cf6 100644 --- a/IkiWiki/Plugin/openid.pm +++ b/IkiWiki/Plugin/openid.pm @@ -77,7 +77,7 @@ sub openid_selector { my $template=IkiWiki::template("openid-selector.tmpl"); $template->param( - cgiurl => $config{cgiurl}, + cgiurl => IkiWiki::cgiurl(), (defined $openid_error ? (openid_error => $openid_error) : ()), (defined $openid_url ? (openid_url => $openid_url) : ()), ($real_cgi_signin ? (nonopenidform => $real_cgi_signin->($q, $session, 1)) : ()), @@ -148,7 +148,7 @@ sub validate ($$$;$) { } my $cgiurl=$config{openid_cgiurl}; - $cgiurl=$config{cgiurl} if ! defined $cgiurl; + $cgiurl=IkiWiki::cgiurl() if ! defined $cgiurl; my $trust_root=$config{openid_realm}; $trust_root=$cgiurl if ! defined $trust_root; @@ -175,7 +175,7 @@ sub auth ($$) { IkiWiki::redirect($q, $setup_url); } elsif ($csr->user_cancel) { - IkiWiki::redirect($q, $config{url}); + IkiWiki::redirect($q, IkiWiki::baseurl(undef)); } elsif (my $vident = $csr->verified_identity) { $session->param(name => $vident->url); @@ -249,7 +249,7 @@ sub getobj ($$) { } my $cgiurl=$config{openid_cgiurl}; - $cgiurl=$config{cgiurl} if ! defined $cgiurl; + $cgiurl=IkiWiki::cgiurl() if ! defined $cgiurl; return Net::OpenID::Consumer->new( ua => $ua, diff --git a/IkiWiki/Plugin/parentlinks.pm b/IkiWiki/Plugin/parentlinks.pm index bbd2c5752..203ea13b6 100644 --- a/IkiWiki/Plugin/parentlinks.pm +++ b/IkiWiki/Plugin/parentlinks.pm @@ -27,7 +27,7 @@ sub parentlinks ($) { if (! length $page) { # dynamic page return { - url => $config{url}, + url => IkiWiki::baseurl(undef), page => $config{wikiname}, }; } diff --git a/IkiWiki/Plugin/pinger.pm b/IkiWiki/Plugin/pinger.pm index cc9f52d2b..932619496 100644 --- a/IkiWiki/Plugin/pinger.pm +++ b/IkiWiki/Plugin/pinger.pm @@ -106,6 +106,8 @@ sub ping { # only ping when a page was changed, so a ping loop # will still be avoided. next if $url=~/^\Q$config{cgiurl}\E/; + my $local_cgiurl = IkiWiki::cgiurl(); + next if $url=~/^\Q$local_cgiurl\E/; $ua->get($url); } diff --git a/IkiWiki/Plugin/poll.pm b/IkiWiki/Plugin/poll.pm index b333e2cdc..2773486a6 100644 --- a/IkiWiki/Plugin/poll.pm +++ b/IkiWiki/Plugin/poll.pm @@ -52,7 +52,7 @@ sub preprocess (@) { foreach my $choice (@choices) { if ($open && exists $config{cgiurl}) { # use POST to avoid robots - $ret.="<form method=\"POST\" action=\"$config{cgiurl}\">\n"; + $ret.="<form method=\"POST\" action=\"".IkiWiki::cgiurl()."\">\n"; } my $percent=$total > 0 ? int($choices{$choice} / $total * 100) : 0; $ret.="<p>\n"; @@ -103,7 +103,7 @@ sub sessioncgi ($$) { my $oldchoice=$session->param($choice_param); if (defined $oldchoice && $oldchoice eq $choice) { # Same vote; no-op. - IkiWiki::redirect($cgi, urlto($page, undef, 1)); + IkiWiki::redirect($cgi, urlto($page)); exit; } @@ -153,7 +153,7 @@ sub sessioncgi ($$) { error($@) if $@; my $cookie = CGI::Cookie->new(-name=> $session->name, -value=> $session->id); print $cgi->redirect(-cookie => $cookie, - -url => urlto($page, undef, 1)); + -url => urlto($page)); exit; } } diff --git a/IkiWiki/Plugin/recentchanges.pm b/IkiWiki/Plugin/recentchanges.pm index 562f61d40..6fccd16f6 100644 --- a/IkiWiki/Plugin/recentchanges.pm +++ b/IkiWiki/Plugin/recentchanges.pm @@ -84,7 +84,7 @@ sub sessioncgi ($$) { method => 'POST', javascript => 0, params => $q, - action => $config{cgiurl}, + action => IkiWiki::cgiurl(), stylesheet => 1, template => { template('revert.tmpl') }, fields => [qw{revertmessage do sid rev}], @@ -127,7 +127,7 @@ sub sessioncgi ($$) { exit 0; } - IkiWiki::redirect($q, urlto($config{recentchangespage}, '')); + IkiWiki::redirect($q, urlto($config{recentchangespage})); exit 0; } @@ -178,7 +178,7 @@ sub store ($$$) { else { $_->{link} = pagetitle($_->{page}); } - $_->{baseurl}="$config{url}/" if length $config{url}; + $_->{baseurl}=IkiWiki::baseurl(undef) if length $config{url}; $_; } @{$change->{pages}} @@ -226,7 +226,7 @@ sub store ($$$) { wikiname => $config{wikiname}, ); - $template->param(permalink => "$config{url}/$config{recentchangespage}/#change-".titlepage($change->{rev})) + $template->param(permalink => urlto($config{recentchangespage}, undef)."#change-".titlepage($change->{rev})) if exists $config{url}; IkiWiki::run_hooks(pagetemplate => sub { diff --git a/IkiWiki/Plugin/relativedate.pm b/IkiWiki/Plugin/relativedate.pm index 7296889ab..4ae0be861 100644 --- a/IkiWiki/Plugin/relativedate.pm +++ b/IkiWiki/Plugin/relativedate.pm @@ -28,18 +28,17 @@ sub format (@) { if (! ($params{content}=~s!^(<body[^>]*>)!$1.include_javascript($params{page})!em)) { # no <body> tag, probably in preview mode - $params{content}=include_javascript($params{page}, 1).$params{content}; + $params{content}=include_javascript(undef).$params{content}; } return $params{content}; } -sub include_javascript ($;$) { - my $page=shift; - my $absolute=shift; +sub include_javascript ($) { + my $from=shift; - return '<script src="'.urlto("ikiwiki/ikiwiki.js", $page, $absolute). + return '<script src="'.urlto("ikiwiki/ikiwiki.js", $from). '" type="text/javascript" charset="utf-8"></script>'."\n". - '<script src="'.urlto("ikiwiki/relativedate.js", $page, $absolute). + '<script src="'.urlto("ikiwiki/relativedate.js", $from). '" type="text/javascript" charset="utf-8"></script>'; } diff --git a/IkiWiki/Plugin/remove.pm b/IkiWiki/Plugin/remove.pm index 1717c8cf3..bc481502a 100644 --- a/IkiWiki/Plugin/remove.pm +++ b/IkiWiki/Plugin/remove.pm @@ -100,7 +100,7 @@ sub confirmation_form ($$) { method => 'POST', javascript => 0, params => $q, - action => $config{cgiurl}, + action => IkiWiki::cgiurl(), stylesheet => 1, fields => [qw{do page}], ); @@ -240,7 +240,7 @@ sub sessioncgi ($$) { if (! exists $pagesources{$parent}) { $parent="index"; } - IkiWiki::redirect($q, urlto($parent, '/', 1)); + IkiWiki::redirect($q, urlto($parent)); } } else { diff --git a/IkiWiki/Plugin/rename.pm b/IkiWiki/Plugin/rename.pm index a05e85be0..57747d3c9 100644 --- a/IkiWiki/Plugin/rename.pm +++ b/IkiWiki/Plugin/rename.pm @@ -126,7 +126,7 @@ sub rename_form ($$$) { method => 'POST', javascript => 0, params => $q, - action => $config{cgiurl}, + action => IkiWiki::cgiurl(), stylesheet => 1, fields => [qw{do page new_name attachment}], ); diff --git a/IkiWiki/Plugin/search.pm b/IkiWiki/Plugin/search.pm index 8fb9dff0c..78eb750b5 100644 --- a/IkiWiki/Plugin/search.pm +++ b/IkiWiki/Plugin/search.pm @@ -58,7 +58,7 @@ sub pagetemplate (@) { if ($template->query(name => "searchform")) { if (! defined $form) { my $searchform = template("searchform.tmpl", blind_cache => 1); - $searchform->param(searchaction => $config{cgiurl}); + $searchform->param(searchaction => IkiWiki::cgiurl()); $searchform->param(html5 => $config{html5}); $form=$searchform->output; } @@ -176,7 +176,7 @@ sub cgi ($) { # only works for GET requests chdir("$config{wikistatedir}/xapian") || error("chdir: $!"); $ENV{OMEGA_CONFIG_FILE}="./omega.conf"; - $ENV{CGIURL}=$config{cgiurl}, + $ENV{CGIURL}=IkiWiki::cgiurl(); IkiWiki::loadindex(); $ENV{HELPLINK}=htmllink("", "", "ikiwiki/searching", noimageinline => 1, linktext => "Help"); diff --git a/IkiWiki/Plugin/toggle.pm b/IkiWiki/Plugin/toggle.pm index 1f93f87fe..af4d2ba3a 100644 --- a/IkiWiki/Plugin/toggle.pm +++ b/IkiWiki/Plugin/toggle.pm @@ -70,19 +70,18 @@ sub format (@) { $params{content}=~s/<div class="toggleableend">//g; if (! ($params{content}=~s!^(<body[^>]*>)!$1.include_javascript($params{page})!em)) { # no <body> tag, probably in preview mode - $params{content}=include_javascript($params{page}, 1).$params{content}; + $params{content}=include_javascript(undef).$params{content}; } } return $params{content}; } -sub include_javascript ($;$) { - my $page=shift; - my $absolute=shift; +sub include_javascript ($) { + my $from=shift; - return '<script src="'.urlto("ikiwiki/ikiwiki.js", $page, $absolute). + return '<script src="'.urlto("ikiwiki/ikiwiki.js", $from). '" type="text/javascript" charset="utf-8"></script>'."\n". - '<script src="'.urlto("ikiwiki/toggle.js", $page, $absolute). + '<script src="'.urlto("ikiwiki/toggle.js", $from). '" type="text/javascript" charset="utf-8"></script>'; } diff --git a/IkiWiki/Plugin/websetup.pm b/IkiWiki/Plugin/websetup.pm index 9c032fdc6..6a5190301 100644 --- a/IkiWiki/Plugin/websetup.pm +++ b/IkiWiki/Plugin/websetup.pm @@ -288,7 +288,7 @@ sub showform ($$) { fieldsets => [ [main => gettext("main")], ], - action => $config{cgiurl}, + action => IkiWiki::cgiurl(), template => {type => 'div'}, stylesheet => 1, ); @@ -344,7 +344,7 @@ sub showform ($$) { IkiWiki::decode_form_utf8($form); if ($form->submitted eq "Cancel") { - IkiWiki::redirect($cgi, $config{url}); + IkiWiki::redirect($cgi, IkiWiki::baseurl(undef)); return; } elsif (($form->submitted eq 'Save Setup' || $form->submitted eq 'Rebuild Wiki') && $form->validate) { diff --git a/IkiWiki/Plugin/wmd.pm b/IkiWiki/Plugin/wmd.pm index 71d7c9d17..134cfb910 100644 --- a/IkiWiki/Plugin/wmd.pm +++ b/IkiWiki/Plugin/wmd.pm @@ -31,14 +31,13 @@ sub formbuilder_setup (@) { $form->field("do") eq "comment"; $form->tmpl_param("wmd_preview", "<div class=\"wmd-preview\"></div>\n". - include_javascript(undef, 1)); + include_javascript(undef)); } -sub include_javascript ($;$) { - my $page=shift; - my $absolute=shift; +sub include_javascript ($) { + my $from=shift; - my $wmdjs=urlto("wmd/wmd.js", $page, $absolute); + my $wmdjs=urlto("wmd/wmd.js", $from); return <<"EOF" <script type="text/javascript"> wmd_options = { diff --git a/debian/changelog b/debian/changelog index cecf61d5e..ec85743a7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,23 @@ ikiwiki (3.20101201) unstable; urgency=low -- Joey Hess <joeyh@debian.org> Wed, 01 Dec 2010 20:28:01 -0400 +ikiwiki (3.20101130) UNRELEASED; urgency=low + + * Better support for serving the same site on multiple urls. (Such as + a http and a https url, or a ipv4 and an ipv6 url.) + (Thanks, smcv) + * API: urlto without a defined second parameter now generates an url + that starts with "/" (when possible; eg when the site's url and cgiurl + are on the same domain). + * Now when users log in via https, ikiwiki sends a secure cookie, that can + only be used over https. If the user switches to using http, they will + need to re-login. (smcv) + * meta: Fix calling of htmlscrubber to pass the page parameter. + The change of the htmlscrubber to look at page rather than destpage + caused htmlscrubber_skip to not work for meta directives. + + -- Joey Hess <joeyh@debian.org> Mon, 29 Nov 2010 14:44:13 -0400 + ikiwiki (3.20101129) unstable; urgency=low * websetup: Fix encoding problem when restoring old setup file. diff --git a/doc/forum/How_to_list_new_pages__44___inline__63__/comment_1_e989b18bade34a92a9c8fe7099036e15._comment b/doc/forum/How_to_list_new_pages__44___inline__63__/comment_1_e989b18bade34a92a9c8fe7099036e15._comment new file mode 100644 index 000000000..cf6f642d4 --- /dev/null +++ b/doc/forum/How_to_list_new_pages__44___inline__63__/comment_1_e989b18bade34a92a9c8fe7099036e15._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="use an inline directive" + date="2010-11-29T20:39:37Z" + content=""" +This is what the [[ikiwiki/directive/inline]] directive is for. It's often used, to for example, show new posts to a blog. If you want to show new posts to anywhere in your site, or whatever, you can configure the [[ikiwiki/PageSpec]] in it to do that, too. + +For example, you could use this: + + The most recent 3 pages added to this site: + \[[!inline pages=\"*\" archive=yes show=4]] +"""]] diff --git a/doc/forum/Need_something_more_powerful_than_Exclude/comment_3_1ed260b0083a290688425a006a83f603._comment b/doc/forum/Need_something_more_powerful_than_Exclude/comment_3_1ed260b0083a290688425a006a83f603._comment new file mode 100644 index 000000000..8b93acd79 --- /dev/null +++ b/doc/forum/Need_something_more_powerful_than_Exclude/comment_3_1ed260b0083a290688425a006a83f603._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2010-11-29T20:41:49Z" + content=""" +`%pagesources` gets nuked when you rebuild the whole wiki with eg, ikiwiki -setup or ikiwiki -rebuild. So you shouldn't normally need to remove the indexdb, just rebuild when making this sort of change that affects the whole site. +"""]] diff --git a/doc/forum/Need_something_more_powerful_than_Exclude/comment_4_c39bdaf38e1e20db74eb26f0560bd673._comment b/doc/forum/Need_something_more_powerful_than_Exclude/comment_4_c39bdaf38e1e20db74eb26f0560bd673._comment new file mode 100644 index 000000000..15f1fecb8 --- /dev/null +++ b/doc/forum/Need_something_more_powerful_than_Exclude/comment_4_c39bdaf38e1e20db74eb26f0560bd673._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://kerravonsen.dreamwidth.org/" + ip="60.241.8.244" + subject="comment 4" + date="2010-11-30T02:35:43Z" + content=""" +One would think that would be the case, yes, but for some reason it didn't work for me. 8-( + +[[KathrynAndersen]] +"""]] diff --git a/doc/news/version_3.20101129.mdwn b/doc/news/version_3.20101129.mdwn new file mode 100644 index 000000000..366ad6e27 --- /dev/null +++ b/doc/news/version_3.20101129.mdwn @@ -0,0 +1,20 @@ +ikiwiki 3.20101129 released with [[!toggle text="these changes"]] +[[!toggleable text=""" + * websetup: Fix encoding problem when restoring old setup file. + * more: Add pages parameter to limit where the more is displayed. + (thanks, dark) + * Fix escaping of filenames in historyurl. (Thanks, aj) + * inline: Improve RSS url munging to use a proper html parser, + and support all elements that HTML::Tagset knows about. + (Which doesn't include html5 just yet, but then the old version + didn't either.) Bonus: 4 times faster than old regexp method. + * Optimise glob() pagespec. (Thanks, Kathryn and smcv) + * highlight: Support new format of filetypes.conf used by version 3.2 + of the highlight package. + * edittemplate: Fix crash if using a .tmpl file or other non-page file + as a template for a new page. + * git: Fix temp file location. + * rename: Fix to pass named parameters to rcs\_commit. + * git: Avoid adding files when committing, so as not to implicitly add + files like recentchanges files that are not normally checked in, + when fixing links after rename."""]]
\ No newline at end of file diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index 6b751f0cd..3cab7588e 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -1,4 +1,4 @@ -Ikiwiki's plugin interface allows all kinds of useful [[plugins]] to be +lkiwiki's plugin interface allows all kinds of useful [[plugins]] to be written to extend ikiwiki in many ways. Despite the length of this page, it's not really hard. This page is a complete reference to everything a plugin might want to do. There is also a quick [[tutorial]]. @@ -982,14 +982,19 @@ This is the standard gettext function, although slightly optimised. This is the standard ngettext function, although slightly optimised. -### `urlto($$;$)` +### `urlto($;$$)` Construct a relative url to the first parameter from the page named by the second. The first parameter can be either a page name, or some other destination file, as registered by `will_render`. -If the third parameter is passed and is true, an absolute url will be -constructed instead of the default relative url. +If the second parameter is not specified (or `undef`), the URL will be +valid from any page on the wiki, or from the CGI; if possible it'll +be a path starting with `/`, but an absolute URL will be used if +the wiki and the CGI are on different domains. + +If the third parameter is passed and is true, the url will be a fully +absolute url. This is useful when generating an url to publish elsewhere. ### `newpagefile($$)` diff --git a/doc/todo/transient_pages.mdwn b/doc/todo/transient_pages.mdwn index 9c1be7362..642114d97 100644 --- a/doc/todo/transient_pages.mdwn +++ b/doc/todo/transient_pages.mdwn @@ -21,9 +21,45 @@ content for the edit box; after that, it'd become a static page. --[[smcv]] -------------------------- -[[!template id=gitbranch branch=smcv/transient author="[[smcv]]"]] +[[!template id=gitbranch branch=smcv/ready/transient author="[[smcv]]"]] [[!tag patch]] +I think this branch is now enough to be useful. It adds the following: + +If the `transient` plugin is loaded, `$srcdir/.ikiwiki/transient` is added +as an underlay. + +Pages with the default extension in the transient underlay are automatically +deleted if a page of the same name is created in the srcdir (or an underlay +closer to the srcdir in stacking order). + +`tag` enables `transient`, and if `tag_autocreate_commit` is set to 0 +(default 1), autocreated tags are written to the transient underlay. + +`autoindex` uses autofiles. It also enables `transient`, and if +`autoindex_commit` is set to 0 (default 1), autoindexes are written to +the transient underlay. + +autoindex ignores pages in the transient underlay when deciding whether +to generate an index. + +Not done yet: + +`remove` can't remove transient pages: this turns out to be harder than +I'd hoped, because I don't want to introduce a vulnerability in the +non-regular-file detection... + +Transient tags that don't match any pages aren't deleted: I'm not sure +that that's a good idea anyway, though. Similarly, transient autoindexes +of directories that become empty aren't deleted. + +Recent changes and aggregated files could conceivably go in the transient +underlay too. + +-------------------------- + +## An earlier version + I had a look at implementing this. It turns out to be harder than I thought to have purely in-memory pages (several plugins want to be able to access the source file as a file), but I did get this proof-of-concept branch diff --git a/doc/todo/use_secure_cookies_for_ssl_logins.mdwn b/doc/todo/use_secure_cookies_for_ssl_logins.mdwn index a7030d08c..194db2f36 100644 --- a/doc/todo/use_secure_cookies_for_ssl_logins.mdwn +++ b/doc/todo/use_secure_cookies_for_ssl_logins.mdwn @@ -15,11 +15,22 @@ get a secure session cookie, but if you log in over HTTP, you won't. > just be changed in the sslcookie = 0 case. It seems sorta reasonable > that, once I've logged in via https, I need to re-login if I then > switch to http. -> + +>> Even better. I've amended the branch to have this behaviour, which +>> turns it into a one-line patch. --[[smcv]] + > And, if your change is made, the sslcookie option could probably itself > be dropped too -- at least I don't see a real use case for it if ikiwiki > is more paranoid about cookies by default. -> + +>> I haven't done that; it might make sense to do so, but I think it'd be +>> better to leave it in as a safety-catch (or in case someone's +>> using a webserver that doesn't put `$HTTPS` in the environment). --s + > Might be best to fix > [[todo/want_to_avoid_ikiwiki_using_http_or_https_in_urls_to_allow_serving_both]] > first, so that dual https/http sites can better be set up. --[[Joey]] + +>> Thanks for merging that! :-) --s + +[[merged|done]] --[[Joey]] diff --git a/doc/todo/want_to_avoid_ikiwiki_using_http_or_https_in_urls_to_allow_serving_both.mdwn b/doc/todo/want_to_avoid_ikiwiki_using_http_or_https_in_urls_to_allow_serving_both.mdwn index 264eb9688..f7938b061 100644 --- a/doc/todo/want_to_avoid_ikiwiki_using_http_or_https_in_urls_to_allow_serving_both.mdwn +++ b/doc/todo/want_to_avoid_ikiwiki_using_http_or_https_in_urls_to_allow_serving_both.mdwn @@ -319,3 +319,5 @@ Potential future things: >> core code (IkiWiki, CGI, Render and the pseudo-core part of editpage) >> and 5 in plugins, since I used it for things like redirection back >> to the top of the wiki --[[smcv]] + +[[merged|done]] --[[Joey]] diff --git a/t/urlto.t b/t/urlto.t new file mode 100755 index 000000000..254455792 --- /dev/null +++ b/t/urlto.t @@ -0,0 +1,46 @@ +#!/usr/bin/perl +use warnings; +use strict; +use Test::More tests => 21; + +BEGIN { use_ok("IkiWiki"); } + +$IkiWiki::config{srcdir} = '/does/not/exist/'; +$IkiWiki::config{usedirs} = 1; +$IkiWiki::config{htmlext} = "HTML"; +$IkiWiki::config{wiki_file_chars} = "A-Za-z0-9._"; + +$IkiWiki::config{url} = "http://smcv.example.co.uk"; +$IkiWiki::config{cgiurl} = "http://smcv.example.co.uk/cgi-bin/ikiwiki.cgi"; +is(IkiWiki::checkconfig(), 1); + +# absolute version +is(IkiWiki::cgiurl(cgiurl => $config{cgiurl}), "http://smcv.example.co.uk/cgi-bin/ikiwiki.cgi"); +is(IkiWiki::cgiurl(cgiurl => $config{cgiurl}, do => 'badger'), "http://smcv.example.co.uk/cgi-bin/ikiwiki.cgi?do=badger"); +is(IkiWiki::urlto('index', undef, 1), "http://smcv.example.co.uk/"); +is(IkiWiki::urlto('stoats', undef, 1), "http://smcv.example.co.uk/stoats/"); + +# "local" (absolute path within site) version (default for cgiurl) +is(IkiWiki::cgiurl(), "/cgi-bin/ikiwiki.cgi"); +is(IkiWiki::cgiurl(do => 'badger'), "/cgi-bin/ikiwiki.cgi?do=badger"); +is(IkiWiki::baseurl(undef), "/"); +is(IkiWiki::urlto('index', undef), "/"); +is(IkiWiki::urlto('index'), "/"); +is(IkiWiki::urlto('stoats', undef), "/stoats/"); +is(IkiWiki::urlto('stoats'), "/stoats/"); + +# fully-relative version (default for urlto and baseurl) +is(IkiWiki::baseurl('badger/mushroom'), "../../"); +is(IkiWiki::urlto('badger/mushroom', 'snake'), "../badger/mushroom/"); + +# explicit cgiurl override +is(IkiWiki::cgiurl(cgiurl => 'https://foo/ikiwiki'), "https://foo/ikiwiki"); +is(IkiWiki::cgiurl(do => 'badger', cgiurl => 'https://foo/ikiwiki'), "https://foo/ikiwiki?do=badger"); + +# with url and cgiurl on different sites, "local" degrades to absolute +$IkiWiki::config{url} = "http://example.co.uk/~smcv"; +$IkiWiki::config{cgiurl} = "http://dynamic.example.co.uk/~smcv/ikiwiki.cgi"; +is(IkiWiki::checkconfig(), 1); +is(IkiWiki::cgiurl(), "http://dynamic.example.co.uk/~smcv/ikiwiki.cgi"); +is(IkiWiki::baseurl(undef), "http://example.co.uk/~smcv/"); +is(IkiWiki::urlto('stoats', undef), "http://example.co.uk/~smcv/stoats/"); |