From 156f70912213b6520e9056050a8827de66e80176 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 4 Nov 2011 19:32:41 +0000 Subject: [PATCH 001/849] trail: new plugin (3rd attempt) --- IkiWiki/Plugin/trail.pm | 486 ++++++++++++++++++++++++++++++++++++ doc/style.css | 35 +++ doc/templates.mdwn | 2 + t/trail.t | 159 ++++++++++++ templates/page.tmpl | 11 + templates/trails.tmpl | 23 ++ themes/actiontabs/style.css | 5 + themes/blueview/style.css | 9 +- 8 files changed, 728 insertions(+), 2 deletions(-) create mode 100644 IkiWiki/Plugin/trail.pm create mode 100755 t/trail.t create mode 100644 templates/trails.tmpl diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm new file mode 100644 index 000000000..e9b4d9cd4 --- /dev/null +++ b/IkiWiki/Plugin/trail.pm @@ -0,0 +1,486 @@ +#!/usr/bin/perl +# Copyright © 2008-2011 Joey Hess +# Copyright © 2009-2011 Simon McVittie +# Licensed under the GNU GPL, version 2, or any later version published by the +# Free Software Foundation +package IkiWiki::Plugin::trail; + +use warnings; +use strict; +use IkiWiki 3.00; + +sub import { + hook(type => "getsetup", id => "trail", call => \&getsetup); + hook(type => "needsbuild", id => "trail", call => \&needsbuild); + hook(type => "preprocess", id => "trail", call => \&preprocess_trail, scan => 1); + hook(type => "preprocess", id => "trailinline", call => \&preprocess_trailinline, scan => 1); + hook(type => "preprocess", id => "trailitem", call => \&preprocess_trailitem, scan => 1); + hook(type => "preprocess", id => "traillink", call => \&preprocess_traillink, scan => 1); + hook(type => "pagetemplate", id => "trail", call => \&pagetemplate); +} + +=head1 Page state + +If a page C<$T> is a trail, then it can have + +=over + +=item * C<$pagestate{$T}{trail}{contents}> + +Reference to an array of pagespecs or links in the trail. + +=item * C<$pagestate{$T}{trail}{sort}> + +A [[ikiwiki/pagespec/sorting]] order; if absent or undef, the trail is in +the order given by the links that form it + +=item * C<$pagestate{$T}{trail}{circular}> + +True if this trail is circular (i.e. going "next" from the last item is +allowed, and takes you back to the first) + +=item * C<$pagestate{$T}{trail}{reverse}> + +True if C is to be reversed. + +=back + +If a page C<$M> is a member of a trail C<$T>, then it has + +=over + +=item * C<$pagestate{$M}{trail}{item}{$T}[0]> + +The page before this one in C<$T> at the last rebuild, or undef. + +=item * C<$pagestate{$M}{trail}{item}{$T}[1]> + +The page after this one in C<$T> at the last refresh, or undef. + +=back + +=cut + +sub getsetup () { + return + plugin => { + safe => 1, + rebuild => undef, + }, +} + +sub needsbuild (@) { + my $needsbuild=shift; + foreach my $page (keys %pagestate) { + if (exists $pagestate{$page}{trail}) { + if (exists $pagesources{$page} && + grep { $_ eq $pagesources{$page} } @$needsbuild) { + # Remove state, it will be re-added + # if the preprocessor directive is still + # there during the rebuild. {item} is the + # only thing that's added for items, not + # trails, and it's harmless to delete that - + # the item is being rebuilt anyway. + delete $pagestate{$page}{trail}; + } + } + } + return $needsbuild; +} + +=for wiki + +The `trail` directive is supplied by the [[plugins/contrib/trail]] +plugin. It sets options for the trail represented by this page. Example usage: + + \[[!trail sort="meta(date)" circular="no" pages="blog/posts/*"]] + +The available options are: + +* `sort`: sets a [[ikiwiki/pagespec/sorting]] order; if not specified, the + items of the trail are ordered according to the first link to each item + found on the trail page + +* `circular`: if set to `yes` or `1`, the trail is made into a loop by + making the last page's "next" link point to the first page, and the first + page's "previous" link point to the last page + +* `pages`: add the given pages to the trail + +=cut + +sub preprocess_trail (@) { + my %params = @_; + + if (exists $params{circular}) { + $pagestate{$params{page}}{trail}{circular} = + IkiWiki::yesno($params{circular}); + } + + if (exists $params{sort}) { + $pagestate{$params{page}}{trail}{sort} = $params{sort}; + } + + if (exists $params{reverse}) { + $pagestate{$params{page}}{trail}{reverse} = $params{reverse}; + } + + if (exists $params{pages}) { + push @{$pagestate{$params{page}}{trail}{contents}}, "pagespec $params{pages}"; + } + + if (exists $params{pagenames}) { + my @list = map { "link $_" } split ' ', $params{pagenames}; + push @{$pagestate{$params{page}}{trail}{contents}}, @list; + } + + return ""; +} + +=for wiki + +The `trailinline` directive is supplied by the [[plugins/contrib/trail]] +plugin. It behaves like the [[trail]] and [[inline]] directives combined. +Like [[inline]], it includes the selected pages into the page with the +directive and/or an RSS or Atom feed; like [[trail]], it turns the +included pages into a "trail" in which each page has a link to the +previous and next pages. + + \[[!inline sort="meta(date)" circular="no" pages="blog/posts/*"]] + +All the options for the [[inline]] and [[trail]] directives are valid. + +The `show`, `skip` and `feedshow` options from [[inline]] do not apply +to the trail. + +* `sort`: sets a [[ikiwiki/pagespec/sorting]] order; if not specified, the + items of the trail are ordered according to the first link to each item + found on the trail page + +* `circular`: if set to `yes` or `1`, the trail is made into a loop by + making the last page's "next" link point to the first page, and the first + page's "previous" link point to the last page + +* `pages`: add the given pages to the trail + +=cut + +sub preprocess_trailinline (@) { + preprocess_trail(@_); + return unless defined wantarray; + + if (IkiWiki->can("preprocess_inline")) { + return IkiWiki::preprocess_inline(@_); + } + else { + error("trailinline directive requires the inline plugin"); + } +} + +=for wiki + +The `trailitem` directive is supplied by the [[plugins/contrib/trail]] plugin. +It is used like this: + + \[[!trailitem some_other_page]] + +to add `some_other_page` to the trail represented by this page, without +generating a visible hyperlink. + +=cut + +sub preprocess_trailitem (@) { + my $link = shift; + shift; + + my %params = @_; + my $trail = $params{page}; + + $link = linkpage($link); + + add_link($params{page}, $link, 'trail'); + push @{$pagestate{$params{page}}{trail}{contents}}, "link $link"; + + return ""; +} + +=for wiki + +The `traillink` directive is supplied by the [[plugins/contrib/trail]] plugin. +It generates a visible [[ikiwiki/WikiLink]], and also adds the linked page to +the trail represented by the page containing the directive. + +In its simplest form, the first parameter is like the content of a WikiLink: + + \[[!traillink some_other_page]] + +The displayed text can also be overridden, either with a `|` symbol or with +a `text` parameter: + + \[[!traillink Click_here_to_start_the_trail|some_other_page]] + \[[!traillink some_other_page text="Click here to start the trail"]] + +=cut + +sub preprocess_traillink (@) { + my $link = shift; + shift; + + my %params = @_; + my $trail = $params{page}; + + $link =~ qr{ + (?: + ([^\|]+) # 1: link text + \| # followed by | + )? # optional + + (.+) # 2: page to link to + }x; + + my $linktext = $1; + $link = linkpage($2); + + add_link($params{page}, $link, 'trail'); + push @{$pagestate{$params{page}}{trail}{contents}}, "link $link"; + + if (defined $linktext) { + $linktext = pagetitle($linktext); + } + + if (exists $params{text}) { + $linktext = $params{text}; + } + + if (defined $linktext) { + return htmllink($trail, $params{destpage}, + $link, linktext => $linktext); + } + + return htmllink($trail, $params{destpage}, $link); +} + +# trail => [member1, member2] +my %trail_to_members; +# member => { trail => [prev, next] } +# e.g. if %trail_to_members = ( +# trail1 => ["member1", "member2"], +# trail2 => ["member0", "member1"], +# ) +# +# then $member_to_trails{member1} = { +# trail1 => [undef, "member2"], +# trail2 => ["member0", undef], +# } +my %member_to_trails; + +# member => 1 +my %rebuild_trail_members; + +sub trails_differ { + my ($old, $new) = @_; + + foreach my $trail (keys %$old) { + if (! exists $new->{$trail}) { + return 1; + } + my ($old_p, $old_n) = @{$old->{$trail}}; + my ($new_p, $new_n) = @{$new->{$trail}}; + $old_p = "" unless defined $old_p; + $old_n = "" unless defined $old_n; + $new_p = "" unless defined $new_p; + $new_n = "" unless defined $new_n; + if ($old_p ne $new_p) { + return 1; + } + if ($old_n ne $new_n) { + return 1; + } + } + + foreach my $trail (keys %$new) { + if (! exists $old->{$trail}) { + return 1; + } + } + + return 0; +} + +my $done_prerender = 0; + +my %origsubs; + +sub prerender { + return if $done_prerender; + + $origsubs{render_backlinks} = \&IkiWiki::render_backlinks; + inject(name => "IkiWiki::render_backlinks", call => \&render_backlinks); + + %trail_to_members = (); + %member_to_trails = (); + + foreach my $trail (keys %pagestate) { + next unless exists $pagestate{$trail}{trail}{contents}; + + my $members = []; + my @contents = @{$pagestate{$trail}{trail}{contents}}; + + + foreach my $c (@contents) { + if ($c =~ m/^pagespec (.*)$/) { + push @$members, pagespec_match_list($trail, $1); + } + elsif ($c =~ m/^link (.*)$/) { + my $best = bestlink($trail, $1); + push @$members, $best if length $best; + } + } + + if (defined $pagestate{$trail}{trail}{sort}) { + # re-sort + @$members = pagespec_match_list($trail, 'internal(*)', + list => $members, + sort => $pagestate{$trail}{trail}{sort}); + } + + if (IkiWiki::yesno $pagestate{$trail}{trail}{reverse}) { + @$members = reverse @$members; + } + + # uniquify + my %seen; + my @tmp; + foreach my $member (@$members) { + push @tmp, $member unless $seen{$member}; + $seen{$member} = 1; + } + $members = [@tmp]; + + for (my $i = 0; $i <= $#$members; $i++) { + my $member = $members->[$i]; + my $prev; + $prev = $members->[$i - 1] if $i > 0; + my $next = $members->[$i + 1]; + + add_depends($member, $trail); + + $member_to_trails{$member}{$trail} = [$prev, $next]; + } + + if ((scalar @$members) > 1 && $pagestate{$trail}{trail}{circular}) { + $member_to_trails{$members->[0]}{$trail}[0] = $members->[$#$members]; + $member_to_trails{$members->[$#$members]}{$trail}[1] = $members->[0]; + } + + $trail_to_members{$trail} = $members; + } + + foreach my $member (keys %pagestate) { + if (exists $pagestate{$member}{trail}{item} && + ! exists $member_to_trails{$member}) { + $rebuild_trail_members{$member} = 1; + delete $pagestate{$member}{trailitem}; + } + } + + foreach my $member (keys %member_to_trails) { + if (! exists $pagestate{$member}{trail}{item}) { + $rebuild_trail_members{$member} = 1; + } + else { + if (trails_differ($pagestate{$member}{trail}{item}, + $member_to_trails{$member})) { + $rebuild_trail_members{$member} = 1; + } + } + + $pagestate{$member}{trail}{item} = $member_to_trails{$member}; + } + + $done_prerender = 1; +} + +# This is called at about the right time that we can hijack it to render +# extra pages. +sub render_backlinks ($) { + my $blc = shift; + + foreach my $member (keys %rebuild_trail_members) { + next unless exists $pagesources{$member}; + + IkiWiki::render($pagesources{$member}, sprintf(gettext("building %s, its previous or next page has changed"), $member)); + } + + $origsubs{render_backlinks}($blc); +} + +sub title_of ($) { + my $page = shift; + if (defined ($pagestate{$page}{meta}{title})) { + return $pagestate{$page}{meta}{title}; + } + return pagetitle(IkiWiki::basename($page)); +} + +my $recursive = 0; + +sub pagetemplate (@) { + my %params = @_; + my $page = $params{page}; + my $template = $params{template}; + + if ($template->query(name => 'trails') && ! $recursive) { + prerender(); + + $recursive = 1; + my $inner = template("trails.tmpl", blind_cache => 1); + IkiWiki::run_hooks(pagetemplate => sub { + shift->(%params, template => $inner) + }); + $template->param(trails => $inner->output); + $recursive = 0; + } + + if ($template->query(name => 'trailloop')) { + prerender(); + + my @trails; + + # sort backlinks by page name to have a consistent order + foreach my $trail (sort keys %{$member_to_trails{$page}}) { + + my $members = $trail_to_members{$trail}; + my ($prev, $next) = @{$member_to_trails{$page}{$trail}}; + my ($prevurl, $nexturl, $prevtitle, $nexttitle); + + if (defined $prev) { + add_depends($params{destpage}, $prev); + $prevurl = urlto($prev, $page); + $prevtitle = title_of($prev); + } + + if (defined $next) { + add_depends($params{destpage}, $next); + $nexturl = urlto($next, $page); + $nexttitle = title_of($next); + } + + push @trails, { + prevpage => $prev, + prevtitle => $prevtitle, + prevurl => $prevurl, + nextpage => $next, + nexttitle => $nexttitle, + nexturl => $nexturl, + trailpage => $trail, + trailtitle => title_of($trail), + trailurl => urlto($trail, $page), + }; + } + + $template->param(trailloop => \@trails); + } +} + +1; diff --git a/doc/style.css b/doc/style.css index 7bbfe5d2a..35a133198 100644 --- a/doc/style.css +++ b/doc/style.css @@ -501,3 +501,38 @@ a.openid_large_btn:focus { .fileupload-content .ui-progressbar-value { background: url(ikiwiki/images/pbar-ani.gif); } + +.trail { + display: block; + clear: both; + position: relative; +} + +.trailprev { + display: block; + text-align: left; + position: absolute; + top: 0%; + left: 3%; + width: 30%; +} + +.trailup { + display: block; + text-align: center; + margin-left: 35%; + margin-right: 35%; +} + +.trailnext { + display: block; + text-align: right; + position: absolute; + top: 0%; + width: 30%; + right: 3%; +} + +.trailsep { + display: none; +} diff --git a/doc/templates.mdwn b/doc/templates.mdwn index d189fa073..43bf9ee51 100644 --- a/doc/templates.mdwn +++ b/doc/templates.mdwn @@ -80,6 +80,8 @@ Here is a full list of the template files used: * `autotag.tmpl` - Filled in by the tag plugin to make tag pages. * `calendarmonth.tmpl`, `calendaryear.tmpl` - Used by ikiwiki-calendar to make calendar archive pages. +* `trails.tmpl` - Used by the trail plugin to generate links on each page + that is a member of a trail. * `editpage.tmpl`, `editconflict.tmpl`, `editcreationconflict.tmpl`, `editfailedsave.tmpl`, `editpagegone.tmpl`, `pocreatepage.tmpl`, `editcomment.tmpl` `commentmoderation.tmpl`, `renamesummary.tmpl`, diff --git a/t/trail.t b/t/trail.t new file mode 100755 index 000000000..ce7d92048 --- /dev/null +++ b/t/trail.t @@ -0,0 +1,159 @@ +#!/usr/bin/perl +use warnings; +use strict; +use Test::More 'no_plan'; +use IkiWiki; + +my $blob; + +ok(! system("rm -rf t/tmp")); +ok(! system("mkdir t/tmp")); + +# Use a rather stylized template to override the default rendering, to make +# it easy to search for the desired results +writefile("templates/trails.tmpl", "t/tmp/in", < + + +EOF +); +writefile("badger.mdwn", "t/tmp/in", "[[!meta title=\"The Breezy Badger\"]]\ncontent of badger"); +writefile("mushroom.mdwn", "t/tmp/in", "content of mushroom"); +writefile("snake.mdwn", "t/tmp/in", "content of snake"); +writefile("ratty.mdwn", "t/tmp/in", "content of ratty"); +writefile("mr_toad.mdwn", "t/tmp/in", "content of mr toad"); +writefile("add.mdwn", "t/tmp/in", '[[!trail pagenames="add/a add/b add/c add/d add/e"]]'); +writefile("add/b.mdwn", "t/tmp/in", "b"); +writefile("add/d.mdwn", "t/tmp/in", "d"); +writefile("del.mdwn", "t/tmp/in", '[[!trail pages="del/*" sort=title]]'); +writefile("del/a.mdwn", "t/tmp/in", "a"); +writefile("del/b.mdwn", "t/tmp/in", "b"); +writefile("del/c.mdwn", "t/tmp/in", "c"); +writefile("del/d.mdwn", "t/tmp/in", "d"); +writefile("del/e.mdwn", "t/tmp/in", "e"); +writefile("self_referential.mdwn", "t/tmp/in", '[[!trail pagenames="self_referential" circular=yes]]'); + +writefile("meme.mdwn", "t/tmp/in", <badger<\/a>/m); +ok($blob =~ /This is a link to badger, with a title<\/a>/m); +ok($blob =~ /That is the badger<\/a>/m); + +$blob = readfile("t/tmp/out/badger.html"); +ok($blob =~ /^trail=meme n=mushroom p=$/m); +ok($blob =~ /^trail=wind_in_the_willows n=mr_toad p=ratty$/m); + +ok(! -f "t/tmp/out/moley.html"); + +$blob = readfile("t/tmp/out/mr_toad.html"); +ok($blob !~ /^trail=meme/m); +ok($blob =~ /^trail=wind_in_the_willows n=ratty p=badger$/m); +# meta title is respected for pages that have one +ok($blob =~ /">< The Breezy Badger<\/a>/m); +# pagetitle for pages that don't +ok($blob =~ /">ratty ><\/a>/m); + +$blob = readfile("t/tmp/out/ratty.html"); +ok($blob !~ /^trail=meme/m); +ok($blob =~ /^trail=wind_in_the_willows n=badger p=mr_toad$/m); + +$blob = readfile("t/tmp/out/mushroom.html"); +ok($blob =~ /^trail=meme n=snake p=badger$/m); +ok($blob !~ /^trail=wind_in_the_willows/m); + +$blob = readfile("t/tmp/out/snake.html"); +ok($blob =~ /^trail=meme n= p=mushroom$/m); +ok($blob !~ /^trail=wind_in_the_willows/m); + +$blob = readfile("t/tmp/out/self_referential.html"); +ok($blob =~ /^trail=self_referential n= p=$/m); + +$blob = readfile("t/tmp/out/add/b.html"); +ok($blob =~ /^trail=add n=add\/d p=$/m); +$blob = readfile("t/tmp/out/add/d.html"); +ok($blob =~ /^trail=add n= p=add\/b$/m); +ok(! -f "t/tmp/out/add/a.html"); +ok(! -f "t/tmp/out/add/c.html"); +ok(! -f "t/tmp/out/add/e.html"); + +$blob = readfile("t/tmp/out/del/a.html"); +ok($blob =~ /^trail=del n=del\/b p=$/m); +$blob = readfile("t/tmp/out/del/b.html"); +ok($blob =~ /^trail=del n=del\/c p=del\/a$/m); +$blob = readfile("t/tmp/out/del/c.html"); +ok($blob =~ /^trail=del n=del\/d p=del\/b$/m); +$blob = readfile("t/tmp/out/del/d.html"); +ok($blob =~ /^trail=del n=del\/e p=del\/c$/m); +$blob = readfile("t/tmp/out/del/e.html"); +ok($blob =~ /^trail=del n= p=del\/d$/m); + +# Make some changes and refresh + +writefile("add/a.mdwn", "t/tmp/in", "a"); +writefile("add/c.mdwn", "t/tmp/in", "c"); +writefile("add/e.mdwn", "t/tmp/in", "e"); +ok(unlink("t/tmp/in/del/a.mdwn")); +ok(unlink("t/tmp/in/del/c.mdwn")); +ok(unlink("t/tmp/in/del/e.mdwn")); + +ok(! system("$command -refresh")); + +$blob = readfile("t/tmp/out/add/a.html"); +ok($blob =~ /^trail=add n=add\/b p=$/m); +$blob = readfile("t/tmp/out/add/b.html"); +ok($blob =~ /^trail=add n=add\/c p=add\/a$/m); +$blob = readfile("t/tmp/out/add/c.html"); +ok($blob =~ /^trail=add n=add\/d p=add\/b$/m); +$blob = readfile("t/tmp/out/add/d.html"); +ok($blob =~ /^trail=add n=add\/e p=add\/c$/m); +$blob = readfile("t/tmp/out/add/e.html"); +ok($blob =~ /^trail=add n= p=add\/d$/m); + +$blob = readfile("t/tmp/out/del/b.html"); +ok($blob =~ /^trail=del n=del\/d p=$/m); +$blob = readfile("t/tmp/out/del/d.html"); +ok($blob =~ /^trail=del n= p=del\/b$/m); +ok(! -f "t/tmp/out/del/a.html"); +ok(! -f "t/tmp/out/del/c.html"); +ok(! -f "t/tmp/out/del/e.html"); + +#ok(! system("rm -rf t/tmp")); diff --git a/templates/page.tmpl b/templates/page.tmpl index 8659018a0..770ac2399 100644 --- a/templates/page.tmpl +++ b/templates/page.tmpl @@ -27,6 +27,15 @@ + + + + + + + + + @@ -103,6 +112,8 @@ + + diff --git a/templates/trails.tmpl b/templates/trails.tmpl new file mode 100644 index 000000000..54c046043 --- /dev/null +++ b/templates/trails.tmpl @@ -0,0 +1,23 @@ + + + diff --git a/themes/actiontabs/style.css b/themes/actiontabs/style.css index 749d9b21e..26cdc1e86 100644 --- a/themes/actiontabs/style.css +++ b/themes/actiontabs/style.css @@ -142,3 +142,8 @@ div.recentchanges { padding: 0 0 0 2ex; border-color: #999; } + +.trails { + /* allow space for the action tabs */ + margin-bottom: 2em; +} diff --git a/themes/blueview/style.css b/themes/blueview/style.css index c07d1cdfa..32f4b32ea 100644 --- a/themes/blueview/style.css +++ b/themes/blueview/style.css @@ -197,18 +197,23 @@ body { font-weight: bold; } -.pageheader .header .title, .pageheader .header .parentlinks, .pageheader .actions ul li, .pageheader .header span, .pageheader #otherlanguages ul li { +.pageheader .header .title, .pageheader .header .parentlinks, .pageheader .actions ul li, .pageheader .header span, .pageheader #otherlanguages ul li, .trailprev, .trailnext, .trailup { padding: 0.25em 0.25em 0.25em 0.25em; background-image: url('background_darkness.png'); background-repeat: repeat; color: white; } -.pageheader .header span a, .pageheader .actions ul li a, .pageheader .header .parentlinks a, .pageheader #otherlanguages ul li a { +.pageheader .header span a, .pageheader .actions ul li a, .pageheader .header .parentlinks a, .pageheader #otherlanguages ul li a, .pageheader a { + font-weight: bold; color: white; text-decoration: none; } +.trailprev, .trailnext, .trailup { + margin-top: 0.5em; +} + .pageheader .actions { text-align: right; vertical-align: bottom; From e0c9837566ceaa716639a11fa2e4734be7c74f62 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 9 Nov 2011 22:48:20 +0000 Subject: [PATCH 002/849] use trailinline for the example blog so it gets next/prev links --- auto-blog.setup | 2 +- doc/examples/blog/posts.mdwn | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/auto-blog.setup b/auto-blog.setup index 0eb83ded6..5617daf9e 100644 --- a/auto-blog.setup +++ b/auto-blog.setup @@ -36,7 +36,7 @@ IkiWiki::Setup::Automator->import( cgiurl => "http://$domain/~$ENV{USER}/$wikiname_short/ikiwiki.cgi", cgi_wrapper => "$ENV{HOME}/public_html/$wikiname_short/ikiwiki.cgi", adminemail => "$ENV{USER}\@$domain", - add_plugins => [qw{goodstuff websetup comments blogspam calendar sidebar}], + add_plugins => [qw{goodstuff websetup comments blogspam calendar sidebar trail}], disable_plugins => [qw{}], libdir => "$ENV{HOME}/.ikiwiki", rss => 1, diff --git a/doc/examples/blog/posts.mdwn b/doc/examples/blog/posts.mdwn index 08e014838..6e9a3f001 100644 --- a/doc/examples/blog/posts.mdwn +++ b/doc/examples/blog/posts.mdwn @@ -1,3 +1,3 @@ Here is a full list of posts to the [[blog|index]]. -[[!inline pages="page(./posts/*) and !*/Discussion" archive=yes feedshow=10 quick=yes]] +[[!trailinline pages="page(./posts/*) and !*/Discussion" archive=yes feedshow=10 quick=yes]] From 272e0b2f17c33c625b494b07f581da400066a216 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 12 Nov 2011 15:11:02 +0000 Subject: [PATCH 003/849] Add path and path_natural sort orders --- IkiWiki.pm | 1 + IkiWiki/Plugin/sortnaturally.pm | 5 +++++ doc/ikiwiki/pagespec/sorting.mdwn | 6 +++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/IkiWiki.pm b/IkiWiki.pm index 637d56c73..3d13cb106 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -2792,6 +2792,7 @@ sub cmp_title { IkiWiki::pagetitle(IkiWiki::basename($b)) } +sub cmp_path { IkiWiki::pagetitle($a) cmp IkiWiki::pagetitle($b) } sub cmp_mtime { $IkiWiki::pagemtime{$b} <=> $IkiWiki::pagemtime{$a} } sub cmp_age { $IkiWiki::pagectime{$b} <=> $IkiWiki::pagectime{$a} } diff --git a/IkiWiki/Plugin/sortnaturally.pm b/IkiWiki/Plugin/sortnaturally.pm index b038b2f9a..108b489f8 100644 --- a/IkiWiki/Plugin/sortnaturally.pm +++ b/IkiWiki/Plugin/sortnaturally.pm @@ -30,4 +30,9 @@ sub cmp_title_natural { IkiWiki::pagetitle(IkiWiki::basename($b))) } +sub cmp_path_natural { + Sort::Naturally::ncmp(IkiWiki::pagetitle($a), + IkiWiki::pagetitle($b)) +} + 1; diff --git a/doc/ikiwiki/pagespec/sorting.mdwn b/doc/ikiwiki/pagespec/sorting.mdwn index ccd7f7eaa..0c6cc74c7 100644 --- a/doc/ikiwiki/pagespec/sorting.mdwn +++ b/doc/ikiwiki/pagespec/sorting.mdwn @@ -7,10 +7,14 @@ orders can be specified. * `mtime` - List pages with the most recently modified first. -* `title` - Order by title (page name). +* `title` - Order by title (page name), e.g. "z/a a/b a/c" + +* `path` - Order by page name including parents, e.g. "a/b a/c z/a" [[!if test="enabled(sortnaturally)" then=""" * `title_natural` - Orders by title, but numbers in the title are treated as such, ("1 2 9 10 20" instead of "1 10 2 20 9") + +* `path_natural` - Like `path`, but numbers in the title are treated as such """]] [[!if test="enabled(meta)" then=""" * `meta(title)` - Order according to the `\[[!meta title="foo" sortas="bar"]]` From 903a5a314f1f5d833dbc208ce128f24195b40e4b Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 12 Nov 2011 16:02:20 +0000 Subject: [PATCH 004/849] Add path and path_natural sort orders These correspond to title and title_natural, but compare the entire path: a < a/b < a/z < ab < b. --- t/cmp_path.t | 48 +++++++++++++++++++++++++++++++++++++++++ t/pagespec_match_list.t | 4 ++-- 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100755 t/cmp_path.t diff --git a/t/cmp_path.t b/t/cmp_path.t new file mode 100755 index 000000000..9de79f49b --- /dev/null +++ b/t/cmp_path.t @@ -0,0 +1,48 @@ +#!/usr/bin/perl +use warnings; +use strict; +use Test::More tests => 25; + +BEGIN { use_ok("IkiWiki"); } + +%config=IkiWiki::defaultconfig(); +$config{srcdir}=$config{destdir}="/dev/null"; +IkiWiki::checkconfig(); + +sub test { + my ($before, $after) = @_; + + $IkiWiki::SortSpec::a = $before; + $IkiWiki::SortSpec::b = $after; + my $r = IkiWiki::SortSpec::cmp_path(); + + if ($before eq $after) { + is($r, 0); + } + else { + is($r, -1); + } + + $IkiWiki::SortSpec::a = $after; + $IkiWiki::SortSpec::b = $before; + $r = IkiWiki::SortSpec::cmp_path(); + + if ($before eq $after) { + is($r, 0); + } + else { + is($r, 1); + } + + is_deeply([IkiWiki::SortSpec::sort_pages(\&IkiWiki::SortSpec::cmp_path, $before, $after)], + [$before, $after]); + is_deeply([IkiWiki::SortSpec::sort_pages(\&IkiWiki::SortSpec::cmp_path, $after, $before)], + [$before, $after]); +} + +test("a/b/c", "a/b/c"); +test("a/b", "a/c"); +test("a/z", "z/a"); +test("a", "a/b"); +test("a", "a/b"); +test("a/z", "ab"); diff --git a/t/pagespec_match_list.t b/t/pagespec_match_list.t index 244ad9159..7ff178aad 100755 --- a/t/pagespec_match_list.t +++ b/t/pagespec_match_list.t @@ -12,7 +12,7 @@ IkiWiki::checkconfig(); { package IkiWiki::SortSpec; - sub cmp_path { $a cmp $b } + sub cmp_raw_path { $a cmp $b } } %pagesources=( @@ -53,7 +53,7 @@ is_deeply([pagespec_match_list("foo", "post/*", sort => "title", num => 50, reve is_deeply([pagespec_match_list("foo", "post/*", sort => "title", filter => sub { $_[0] =~ /3/}) ], ["post/1", "post/2"]); -is_deeply([pagespec_match_list("foo", "*", sort => "path", num => 2)], +is_deeply([pagespec_match_list("foo", "*", sort => "raw_path", num => 2)], ["bar", "foo"]); is_deeply([pagespec_match_list("foo", "foo* or bar*", sort => "-age title")], # oldest first, break ties by title From 0394a49e67485414591e041aa3dbf3b3eb0b1854 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 12 Nov 2011 16:57:27 +0000 Subject: [PATCH 005/849] trail: avoid collecting trail members twice --- IkiWiki/Plugin/trail.pm | 49 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index e9b4d9cd4..e6e55bbdb 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -88,6 +88,8 @@ sub needsbuild (@) { return $needsbuild; } +my $scanned = 0; + =for wiki The `trail` directive is supplied by the [[plugins/contrib/trail]] @@ -112,6 +114,15 @@ The available options are: sub preprocess_trail (@) { my %params = @_; + # avoid collecting everything in the preprocess stage if we already + # did in the scan stage + if (defined wantarray) { + return "" if $scanned; + } + else { + $scanned = 1; + } + if (exists $params{circular}) { $pagestate{$params{page}}{trail}{circular} = IkiWiki::yesno($params{circular}); @@ -166,14 +177,20 @@ to the trail. =cut sub preprocess_trailinline (@) { - preprocess_trail(@_); - return unless defined wantarray; + my %params = @_; - if (IkiWiki->can("preprocess_inline")) { - return IkiWiki::preprocess_inline(@_); + if (defined wantarray) { + scalar preprocess_trail(%params); + + if (IkiWiki->can("preprocess_inline")) { + return IkiWiki::preprocess_inline(@_); + } + else { + error("trailinline directive requires the inline plugin"); + } } else { - error("trailinline directive requires the inline plugin"); + preprocess_trail(%params); } } @@ -193,6 +210,15 @@ sub preprocess_trailitem (@) { my $link = shift; shift; + # avoid collecting everything in the preprocess stage if we already + # did in the scan stage + if (defined wantarray) { + return "" if $scanned; + } + else { + $scanned = 1; + } + my %params = @_; my $trail = $params{page}; @@ -242,7 +268,18 @@ sub preprocess_traillink (@) { $link = linkpage($2); add_link($params{page}, $link, 'trail'); - push @{$pagestate{$params{page}}{trail}{contents}}, "link $link"; + + # avoid collecting everything in the preprocess stage if we already + # did in the scan stage + my $already; + if (defined wantarray) { + $already = $scanned; + } + else { + $scanned = 1; + } + + push @{$pagestate{$params{page}}{trail}{contents}}, [link => $link] unless $already; if (defined $linktext) { $linktext = pagetitle($linktext); From e0bfd0cafda6a44a826cdfe07b99299cc96dfdf3 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 12 Nov 2011 16:57:54 +0000 Subject: [PATCH 006/849] trail: improve and test sorting --- IkiWiki/Plugin/trail.pm | 46 ++++++++++++++++++++----- t/trail.t | 75 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 9 deletions(-) diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index e6e55bbdb..87d99dd3d 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -123,6 +123,11 @@ sub preprocess_trail (@) { $scanned = 1; } + # trail members from a pagespec ought to be in some sort of order, + # and path is a nice obvious default + $params{sortthese} = 'path' unless exists $params{sortthese}; + $params{reversethese} = 'no' unless exists $params{reversethese}; + if (exists $params{circular}) { $pagestate{$params{page}}{trail}{circular} = IkiWiki::yesno($params{circular}); @@ -137,11 +142,13 @@ sub preprocess_trail (@) { } if (exists $params{pages}) { - push @{$pagestate{$params{page}}{trail}{contents}}, "pagespec $params{pages}"; + push @{$pagestate{$params{page}}{trail}{contents}}, + ["pagespec" => $params{pages}, $params{sortthese}, + IkiWiki::yesno($params{reversethese})]; } if (exists $params{pagenames}) { - my @list = map { "link $_" } split ' ', $params{pagenames}; + my @list = map { [link => $_] } split ' ', $params{pagenames}; push @{$pagestate{$params{page}}{trail}{contents}}, @list; } @@ -179,6 +186,28 @@ to the trail. sub preprocess_trailinline (@) { my %params = @_; + if (exists $params{sort}) { + $params{sortthese} = $params{sort}; + delete $params{sort}; + } + else { + # sort in the same order as [[plugins/inline]]'s default + $params{sortthese} = 'age'; + } + + if (exists $params{reverse}) { + $params{reversethese} = $params{reverse}; + delete $params{reverse}; + } + + if (exists $params{trailsort}) { + $params{sort} = $params{trailsort}; + } + + if (exists $params{trailreverse}) { + $params{reverse} = $params{trailreverse}; + } + if (defined wantarray) { scalar preprocess_trail(%params); @@ -225,7 +254,7 @@ sub preprocess_trailitem (@) { $link = linkpage($link); add_link($params{page}, $link, 'trail'); - push @{$pagestate{$params{page}}{trail}{contents}}, "link $link"; + push @{$pagestate{$params{page}}{trail}{contents}}, [link => $link]; return ""; } @@ -363,13 +392,14 @@ sub prerender { my $members = []; my @contents = @{$pagestate{$trail}{trail}{contents}}; - foreach my $c (@contents) { - if ($c =~ m/^pagespec (.*)$/) { - push @$members, pagespec_match_list($trail, $1); + if ($c->[0] eq 'pagespec') { + push @$members, pagespec_match_list($trail, + $c->[1], sort => $c->[2], + reverse => $c->[3]); } - elsif ($c =~ m/^link (.*)$/) { - my $best = bestlink($trail, $1); + elsif ($c->[0] eq 'link') { + my $best = bestlink($trail, $c->[1]); push @$members, $best if length $best; } } diff --git a/t/trail.t b/t/trail.t index ce7d92048..28aa1c09d 100755 --- a/t/trail.t +++ b/t/trail.t @@ -45,6 +45,29 @@ writefile("del/c.mdwn", "t/tmp/in", "c"); writefile("del/d.mdwn", "t/tmp/in", "d"); writefile("del/e.mdwn", "t/tmp/in", "e"); writefile("self_referential.mdwn", "t/tmp/in", '[[!trail pagenames="self_referential" circular=yes]]'); +writefile("sorting/linked.mdwn", "t/tmp/in", "linked"); +writefile("sorting/a/b.mdwn", "t/tmp/in", "a/b"); +writefile("sorting/a/c.mdwn", "t/tmp/in", "a/c"); +writefile("sorting/z/a.mdwn", "t/tmp/in", "z/a"); +writefile("sorting/beginning.mdwn", "t/tmp/in", "beginning"); +writefile("sorting/middle.mdwn", "t/tmp/in", "middle"); +writefile("sorting/end.mdwn", "t/tmp/in", "end"); +writefile("sorting/new.mdwn", "t/tmp/in", "new"); +writefile("sorting/old.mdwn", "t/tmp/in", "old"); +writefile("sorting/ancient.mdwn", "t/tmp/in", "ancient"); +# These three need to be in the appropriate age order +ok(utime(333333333, 333333333, "t/tmp/in/sorting/new.mdwn")); +ok(utime(222222222, 222222222, "t/tmp/in/sorting/old.mdwn")); +ok(utime(111111111, 111111111, "t/tmp/in/sorting/ancient.mdwn")); +writefile("sorting/linked2.mdwn", "t/tmp/in", "linked2"); +# This initially uses the default sort order: age for trailinline, and path +# for trail. We change it later. +writefile("sorting.mdwn", "t/tmp/in", + '[[!traillink linked]] ' . + '[[!trail pages="sorting/z/a or sorting/a/b or sorting/a/c"]] ' . + '[[!trail pagenames="beginning middle end"]] ' . + '[[!trailinline pages="sorting/old or sorting/ancient or sorting/new"]] ' . + '[[!traillink linked2]]'); writefile("meme.mdwn", "t/tmp/in", < Date: Sat, 12 Nov 2011 17:08:08 +0000 Subject: [PATCH 007/849] trail: update documentation; drop docs for directives, which are now in the wiki --- IkiWiki/Plugin/trail.pm | 94 ++++++----------------------------------- 1 file changed, 14 insertions(+), 80 deletions(-) diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index 87d99dd3d..098b98607 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -27,7 +27,20 @@ If a page C<$T> is a trail, then it can have =item * C<$pagestate{$T}{trail}{contents}> -Reference to an array of pagespecs or links in the trail. +Reference to an array of lists each containing either: + +=over + +=item * C<[link, "link"]> + +A link specification, pointing to the same page that C<[[link]]> would select + +=item * C<[pagespec, "posts/*", "age", 0]> + +A match by pagespec; the third array element is the sort order and the fourth +is whether to reverse sorting + +=back =item * C<$pagestate{$T}{trail}{sort}> @@ -90,27 +103,6 @@ sub needsbuild (@) { my $scanned = 0; -=for wiki - -The `trail` directive is supplied by the [[plugins/contrib/trail]] -plugin. It sets options for the trail represented by this page. Example usage: - - \[[!trail sort="meta(date)" circular="no" pages="blog/posts/*"]] - -The available options are: - -* `sort`: sets a [[ikiwiki/pagespec/sorting]] order; if not specified, the - items of the trail are ordered according to the first link to each item - found on the trail page - -* `circular`: if set to `yes` or `1`, the trail is made into a loop by - making the last page's "next" link point to the first page, and the first - page's "previous" link point to the last page - -* `pages`: add the given pages to the trail - -=cut - sub preprocess_trail (@) { my %params = @_; @@ -155,34 +147,6 @@ sub preprocess_trail (@) { return ""; } -=for wiki - -The `trailinline` directive is supplied by the [[plugins/contrib/trail]] -plugin. It behaves like the [[trail]] and [[inline]] directives combined. -Like [[inline]], it includes the selected pages into the page with the -directive and/or an RSS or Atom feed; like [[trail]], it turns the -included pages into a "trail" in which each page has a link to the -previous and next pages. - - \[[!inline sort="meta(date)" circular="no" pages="blog/posts/*"]] - -All the options for the [[inline]] and [[trail]] directives are valid. - -The `show`, `skip` and `feedshow` options from [[inline]] do not apply -to the trail. - -* `sort`: sets a [[ikiwiki/pagespec/sorting]] order; if not specified, the - items of the trail are ordered according to the first link to each item - found on the trail page - -* `circular`: if set to `yes` or `1`, the trail is made into a loop by - making the last page's "next" link point to the first page, and the first - page's "previous" link point to the last page - -* `pages`: add the given pages to the trail - -=cut - sub preprocess_trailinline (@) { my %params = @_; @@ -223,18 +187,6 @@ sub preprocess_trailinline (@) { } } -=for wiki - -The `trailitem` directive is supplied by the [[plugins/contrib/trail]] plugin. -It is used like this: - - \[[!trailitem some_other_page]] - -to add `some_other_page` to the trail represented by this page, without -generating a visible hyperlink. - -=cut - sub preprocess_trailitem (@) { my $link = shift; shift; @@ -259,24 +211,6 @@ sub preprocess_trailitem (@) { return ""; } -=for wiki - -The `traillink` directive is supplied by the [[plugins/contrib/trail]] plugin. -It generates a visible [[ikiwiki/WikiLink]], and also adds the linked page to -the trail represented by the page containing the directive. - -In its simplest form, the first parameter is like the content of a WikiLink: - - \[[!traillink some_other_page]] - -The displayed text can also be overridden, either with a `|` symbol or with -a `text` parameter: - - \[[!traillink Click_here_to_start_the_trail|some_other_page]] - \[[!traillink some_other_page text="Click here to start the trail"]] - -=cut - sub preprocess_traillink (@) { my $link = shift; shift; From d70ba7cff3fc6cc78ea2f8eb0713212478ab6ba7 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 12 Nov 2011 21:37:28 +0000 Subject: [PATCH 008/849] Split trail directive into trailitems, trailoptions --- IkiWiki/Plugin/trail.pm | 86 ++++++++++++++++++----------------------- t/trail.t | 15 +++---- 2 files changed, 46 insertions(+), 55 deletions(-) diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index 098b98607..5ee152155 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -12,9 +12,10 @@ use IkiWiki 3.00; sub import { hook(type => "getsetup", id => "trail", call => \&getsetup); hook(type => "needsbuild", id => "trail", call => \&needsbuild); - hook(type => "preprocess", id => "trail", call => \&preprocess_trail, scan => 1); + hook(type => "preprocess", id => "trailoptions", call => \&preprocess_trailoptions, scan => 1); hook(type => "preprocess", id => "trailinline", call => \&preprocess_trailinline, scan => 1); hook(type => "preprocess", id => "trailitem", call => \&preprocess_trailitem, scan => 1); + hook(type => "preprocess", id => "trailitems", call => \&preprocess_trailitems, scan => 1); hook(type => "preprocess", id => "traillink", call => \&preprocess_traillink, scan => 1); hook(type => "pagetemplate", id => "trail", call => \&pagetemplate); } @@ -103,23 +104,9 @@ sub needsbuild (@) { my $scanned = 0; -sub preprocess_trail (@) { +sub preprocess_trailoptions (@) { my %params = @_; - # avoid collecting everything in the preprocess stage if we already - # did in the scan stage - if (defined wantarray) { - return "" if $scanned; - } - else { - $scanned = 1; - } - - # trail members from a pagespec ought to be in some sort of order, - # and path is a nice obvious default - $params{sortthese} = 'path' unless exists $params{sortthese}; - $params{reversethese} = 'no' unless exists $params{reversethese}; - if (exists $params{circular}) { $pagestate{$params{page}}{trail}{circular} = IkiWiki::yesno($params{circular}); @@ -133,47 +120,19 @@ sub preprocess_trail (@) { $pagestate{$params{page}}{trail}{reverse} = $params{reverse}; } - if (exists $params{pages}) { - push @{$pagestate{$params{page}}{trail}{contents}}, - ["pagespec" => $params{pages}, $params{sortthese}, - IkiWiki::yesno($params{reversethese})]; - } - - if (exists $params{pagenames}) { - my @list = map { [link => $_] } split ' ', $params{pagenames}; - push @{$pagestate{$params{page}}{trail}{contents}}, @list; - } - return ""; } sub preprocess_trailinline (@) { my %params = @_; - if (exists $params{sort}) { - $params{sortthese} = $params{sort}; - delete $params{sort}; - } - else { + if (! exists $params{sort}) { # sort in the same order as [[plugins/inline]]'s default - $params{sortthese} = 'age'; - } - - if (exists $params{reverse}) { - $params{reversethese} = $params{reverse}; - delete $params{reverse}; - } - - if (exists $params{trailsort}) { - $params{sort} = $params{trailsort}; - } - - if (exists $params{trailreverse}) { - $params{reverse} = $params{trailreverse}; + $params{sort} = 'age'; } if (defined wantarray) { - scalar preprocess_trail(%params); + scalar preprocess_trailitems(%params); if (IkiWiki->can("preprocess_inline")) { return IkiWiki::preprocess_inline(@_); @@ -183,7 +142,7 @@ sub preprocess_trailinline (@) { } } else { - preprocess_trail(%params); + preprocess_trailitems(%params); } } @@ -211,6 +170,37 @@ sub preprocess_trailitem (@) { return ""; } +sub preprocess_trailitems (@) { + my %params = @_; + + # avoid collecting everything in the preprocess stage if we already + # did in the scan stage + if (defined wantarray) { + return "" if $scanned; + } + else { + $scanned = 1; + } + + # trail members from a pagespec ought to be in some sort of order, + # and path is a nice obvious default + $params{sort} = 'path' unless exists $params{sort}; + $params{reverse} = 'no' unless exists $params{reverse}; + + if (exists $params{pages}) { + push @{$pagestate{$params{page}}{trail}{contents}}, + ["pagespec" => $params{pages}, $params{sort}, + IkiWiki::yesno($params{reverse})]; + } + + if (exists $params{pagenames}) { + my @list = map { [link => $_] } split ' ', $params{pagenames}; + push @{$pagestate{$params{page}}{trail}{contents}}, @list; + } + + return ""; +} + sub preprocess_traillink (@) { my $link = shift; shift; diff --git a/t/trail.t b/t/trail.t index 28aa1c09d..0cf50ddc1 100755 --- a/t/trail.t +++ b/t/trail.t @@ -35,16 +35,16 @@ writefile("mushroom.mdwn", "t/tmp/in", "content of mushroom"); writefile("snake.mdwn", "t/tmp/in", "content of snake"); writefile("ratty.mdwn", "t/tmp/in", "content of ratty"); writefile("mr_toad.mdwn", "t/tmp/in", "content of mr toad"); -writefile("add.mdwn", "t/tmp/in", '[[!trail pagenames="add/a add/b add/c add/d add/e"]]'); +writefile("add.mdwn", "t/tmp/in", '[[!trailitems pagenames="add/a add/b add/c add/d add/e"]]'); writefile("add/b.mdwn", "t/tmp/in", "b"); writefile("add/d.mdwn", "t/tmp/in", "d"); -writefile("del.mdwn", "t/tmp/in", '[[!trail pages="del/*" sort=title]]'); +writefile("del.mdwn", "t/tmp/in", '[[!trailitems pages="del/*" sort=title]]'); writefile("del/a.mdwn", "t/tmp/in", "a"); writefile("del/b.mdwn", "t/tmp/in", "b"); writefile("del/c.mdwn", "t/tmp/in", "c"); writefile("del/d.mdwn", "t/tmp/in", "d"); writefile("del/e.mdwn", "t/tmp/in", "e"); -writefile("self_referential.mdwn", "t/tmp/in", '[[!trail pagenames="self_referential" circular=yes]]'); +writefile("self_referential.mdwn", "t/tmp/in", '[[!trailitems pagenames="self_referential" circular=yes]]'); writefile("sorting/linked.mdwn", "t/tmp/in", "linked"); writefile("sorting/a/b.mdwn", "t/tmp/in", "a/b"); writefile("sorting/a/c.mdwn", "t/tmp/in", "a/c"); @@ -64,8 +64,8 @@ writefile("sorting/linked2.mdwn", "t/tmp/in", "linked2"); # for trail. We change it later. writefile("sorting.mdwn", "t/tmp/in", '[[!traillink linked]] ' . - '[[!trail pages="sorting/z/a or sorting/a/b or sorting/a/c"]] ' . - '[[!trail pagenames="beginning middle end"]] ' . + '[[!trailitems pages="sorting/z/a or sorting/a/b or sorting/a/c"]] ' . + '[[!trailitems pagenames="beginning middle end"]] ' . '[[!trailinline pages="sorting/old or sorting/ancient or sorting/new"]] ' . '[[!traillink linked2]]'); @@ -83,7 +83,8 @@ EOF ); writefile("wind_in_the_willows.mdwn", "t/tmp/in", < Date: Tue, 7 Feb 2012 06:05:35 -0400 Subject: [PATCH 009/849] whoops, I meant squeeze --- ...mmend_libtext-markdown-discount_instead_of_depending.mdwn | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/todo/recommend_libtext-markdown-discount_instead_of_depending.mdwn b/doc/todo/recommend_libtext-markdown-discount_instead_of_depending.mdwn index 736e34787..3c1446920 100644 --- a/doc/todo/recommend_libtext-markdown-discount_instead_of_depending.mdwn +++ b/doc/todo/recommend_libtext-markdown-discount_instead_of_depending.mdwn @@ -13,3 +13,8 @@ installable on a wheezy host. -- [[Jon]] > `libtext-markdown-discount-perl | libtext-markdown-perl', > then users will not automatically transition to using discount, which > I want them to do. [[done]] --[[Joey]] + +>> Sorry, I made a mistake in the phrasing of my original request. It's +>> not installable on *squeeze*, which is what I care about, rather than +>> *wheezy*. Someone needs to backport `libtext-markdown-discount` I +>> guess. — [[Jon]] From f995a7bea39087e4eb1dc3512b23bff060a2f023 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 7 Feb 2012 13:22:02 -0400 Subject: [PATCH 010/849] response --- ...mmend_libtext-markdown-discount_instead_of_depending.mdwn | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/todo/recommend_libtext-markdown-discount_instead_of_depending.mdwn b/doc/todo/recommend_libtext-markdown-discount_instead_of_depending.mdwn index 3c1446920..bb953ef8d 100644 --- a/doc/todo/recommend_libtext-markdown-discount_instead_of_depending.mdwn +++ b/doc/todo/recommend_libtext-markdown-discount_instead_of_depending.mdwn @@ -18,3 +18,8 @@ installable on a wheezy host. -- [[Jon]] >> not installable on *squeeze*, which is what I care about, rather than >> *wheezy*. Someone needs to backport `libtext-markdown-discount` I >> guess. — [[Jon]] + +>>> For squeeze, it will be appropriate for an ikiwiki backport to +>>> still depend on the old markdown. Although a discount backport would be +>>> nice! I don't want the current ikiwiki to be held back by requirement +>>> that it be installable as-is on squeeze. --[[Joey]] From 087a9d93c29e4d6bb03ceb4e555470382ac022d9 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik" Date: Tue, 7 Feb 2012 15:58:10 -0400 Subject: [PATCH 011/849] --- doc/forum/Problem_with_gitweb.mdwn | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/forum/Problem_with_gitweb.mdwn diff --git a/doc/forum/Problem_with_gitweb.mdwn b/doc/forum/Problem_with_gitweb.mdwn new file mode 100644 index 000000000..98a7f39a3 --- /dev/null +++ b/doc/forum/Problem_with_gitweb.mdwn @@ -0,0 +1,3 @@ +I use gitweb to display the pagehistories of my local ikiwiki. However since a few weeks it doesn't work anymore and displays just: 404 - No such project. I don't remember that I changed something with my wiki. Any ideas how to fix this? I guess that it could be a permission problem, however I don't really know which permissions are important in this case. + + From ea7e0b77f22d78f1e945b921d68802d916674b51 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawnp4lzWSX1pvSpwAoboehP3SSbmbQESe80" Date: Wed, 8 Feb 2012 00:54:22 -0400 Subject: [PATCH 012/849] Added a comment: I'm trying to use OpenID without success --- ..._f581afcdb4481ea5d65bcc33bdbab99a._comment | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 doc/forum/OpenID_not_working___47___where_to_define_wiki__39__s_ID__63__/comment_3_f581afcdb4481ea5d65bcc33bdbab99a._comment diff --git a/doc/forum/OpenID_not_working___47___where_to_define_wiki__39__s_ID__63__/comment_3_f581afcdb4481ea5d65bcc33bdbab99a._comment b/doc/forum/OpenID_not_working___47___where_to_define_wiki__39__s_ID__63__/comment_3_f581afcdb4481ea5d65bcc33bdbab99a._comment new file mode 100644 index 000000000..1ac15d74c --- /dev/null +++ b/doc/forum/OpenID_not_working___47___where_to_define_wiki__39__s_ID__63__/comment_3_f581afcdb4481ea5d65bcc33bdbab99a._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnp4lzWSX1pvSpwAoboehP3SSbmbQESe80" + nickname="Felipe Augusto" + subject="I'm trying to use OpenID without success" + date="2012-02-08T04:54:22Z" + content=""" +I'm using ikiwiki package from Debian squeeze and I can't seem +to be able to make OpenID work. It's a blog and when I try to +add a comment and click on SignIn, I'm redirected to + +>http://my.site/ikiwiki.cgi?do=commentsignin + + +Once I click on Google logo/icon, it takes a while before showing + +>no_identity_server: The provided URL doesn't declare its OpenID identity server. + + +It's not clear for me what's wrong or if I should add meta openid in some page. +This is the version of libnet-openid-consumer-perl: 1.03-1. It also fails for +Yahoo! and other providers, we never get redirected to Google/Yahoo! or other +verification page. + +Thank you in advance! +"""]] From 38ff2b44c689e94cd0976620b0f5db8ba53bf225 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 8 Feb 2012 16:07:20 -0400 Subject: [PATCH 013/849] Fix a snail mail address. Closes: #659158 --- IkiWiki/Plugin/calendar.pm | 2 +- debian/changelog | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm index fc497b3c7..d443198f6 100644 --- a/IkiWiki/Plugin/calendar.pm +++ b/IkiWiki/Plugin/calendar.pm @@ -13,7 +13,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. require 5.002; package IkiWiki::Plugin::calendar; diff --git a/debian/changelog b/debian/changelog index c8db76966..7eb34f8fe 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +ikiwiki (3.20120203) UNRELEASED; urgency=low + + * Fix a snail mail address. Closes: #659158 + + -- Joey Hess Wed, 08 Feb 2012 16:07:00 -0400 + ikiwiki (3.20120202) unstable; urgency=low * mdwn: Added nodiscount setting, which can be used to avoid using the From a82afbf488fafaebead4a32ad1eae5ccf2c08d1a Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawnjRHxyH6FSS25h_6x3YYbZ6SaVsozC3Ts" Date: Thu, 9 Feb 2012 04:01:09 -0400 Subject: [PATCH 014/849] rename bugs/Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn to bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn --- ..._SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn} | 0 .../discussion.mdwn | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename doc/bugs/{Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn => __91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn} (100%) rename doc/bugs/{Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8 => __91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8}/discussion.mdwn (100%) diff --git a/doc/bugs/Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn b/doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn similarity index 100% rename from doc/bugs/Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn rename to doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn diff --git a/doc/bugs/Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8/discussion.mdwn b/doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8/discussion.mdwn similarity index 100% rename from doc/bugs/Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8/discussion.mdwn rename to doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8/discussion.mdwn From 8be7c6137fd98ba39e4517420ef3950960717d34 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawnjRHxyH6FSS25h_6x3YYbZ6SaVsozC3Ts" Date: Thu, 9 Feb 2012 04:01:48 -0400 Subject: [PATCH 015/849] --- ...andoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn b/doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn index ab4dc8953..c80c9151a 100644 --- a/doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn +++ b/doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn @@ -1,13 +1,6 @@ -I'm writing [pykipandoc plugin](https://github.com/temmen/pykipandoc/blob/master/pykipandoc), that work at least as pandoc-iki. +import os +os.environment['LANG'] = 'it_IT.utf-8' -It works in compile mode, editing pages in web mode however results in +Suona plausibile? - pandoc: : hGetContents: invalid argument (Invalid or incomplete multibyte or wide character) - -I think that is because HTTP POST request building editpage doesn't correctly manage utf-8 contents: see strange chars in this form-data name="editcontent"? - - This principle has guided pandoc’s decisions in finding syntax for tables, footnotes, and other extensions. - -Please, any advice can be sent to [GitHub pykipandoc](https://github.com/temmen/pykipandoc) (some other info there on the [README](https://github.com/temmen/pykipandoc/blob/master/README.md)) and to [temmenel(at)gmail(dot)com](mailto:temmenel@gmail.com). - -¡Thank you all! +[GitHub pykipandoc](https://github.com/temmen/pykipandoc) -- Temmen From 4a6450ca73ed20848cc2d988f42ccbb3ec130e93 Mon Sep 17 00:00:00 2001 From: "http://cgray.myopenid.com/" Date: Thu, 9 Feb 2012 15:01:32 -0400 Subject: [PATCH 016/849] --- doc/git.mdwn | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/git.mdwn b/doc/git.mdwn index 2e58c6992..c9f16a214 100644 --- a/doc/git.mdwn +++ b/doc/git.mdwn @@ -74,6 +74,7 @@ think about merging them. This is recommended. :-) * nezmer `git://gitorious.org/ikiwiki-nezmer/ikiwiki-nezmer.git` * [[yds]] `git://github.com/yds/ikiwiki.git` * [[pelle]] `git://github.com/hemmop/ikiwiki.git` +* [[cgray]] `git://github.com/chrismgray/ikiwiki.git` ## branches From 2717d9774a2214f936af4e9e74f10181e6a9c027 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 9 Feb 2012 16:04:16 -0400 Subject: [PATCH 017/849] close --- ...VED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn b/doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn index c80c9151a..7282a71b8 100644 --- a/doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn +++ b/doc/bugs/__91__SOLVED__93___Pandoc_plugin_and_UTF-8:_IkiWiki_and_UTF-8.mdwn @@ -4,3 +4,8 @@ os.environment['LANG'] = 'it_IT.utf-8' Suona plausibile? [GitHub pykipandoc](https://github.com/temmen/pykipandoc) -- Temmen + +> The place to put contrib plugins is in [[plugins/contrib]]. +> +> Closing this bug report as whatever it is that was fixed is apparently not an ikiwiki +> bug.. I guess. [[done]] --[[Joey]] From ddea0488e98232c251a9624bdcb2e46a8e9d2d93 Mon Sep 17 00:00:00 2001 From: "http://cgray.myopenid.com/" Date: Thu, 9 Feb 2012 22:34:45 -0400 Subject: [PATCH 018/849] Easier if I go by my github name --- doc/git.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/git.mdwn b/doc/git.mdwn index c9f16a214..b8bf501c6 100644 --- a/doc/git.mdwn +++ b/doc/git.mdwn @@ -74,7 +74,7 @@ think about merging them. This is recommended. :-) * nezmer `git://gitorious.org/ikiwiki-nezmer/ikiwiki-nezmer.git` * [[yds]] `git://github.com/yds/ikiwiki.git` * [[pelle]] `git://github.com/hemmop/ikiwiki.git` -* [[cgray]] `git://github.com/chrismgray/ikiwiki.git` +* [[chrismgray]] `git://github.com/chrismgray/ikiwiki.git` ## branches From 1a163a568ca755749cfba74f3b17a6ef1b8ba504 Mon Sep 17 00:00:00 2001 From: "http://cgray.myopenid.com/" Date: Thu, 9 Feb 2012 22:38:20 -0400 Subject: [PATCH 019/849] --- ...be_more_selective_about_running_hooks.mdwn | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 doc/todo/be_more_selective_about_running_hooks.mdwn diff --git a/doc/todo/be_more_selective_about_running_hooks.mdwn b/doc/todo/be_more_selective_about_running_hooks.mdwn new file mode 100644 index 000000000..0c8e0b090 --- /dev/null +++ b/doc/todo/be_more_selective_about_running_hooks.mdwn @@ -0,0 +1,20 @@ +[[!template id=gitbranch branch=chrismgray/exclusive-hooks author="[[chrismgray]]"]] + +Sometimes plugins register a function with `hook`, but they only want +the function called with the content that they know how to deal with. +Normally, this means that they call `pagetype` first thing in the +function, determine if they know how to deal with the content, and +only do anything if they do. + +This is a bit wasteful in itself, but for external plugins, it's +really bad. For functions like `scan` and `linkify`, where the entire +page is sent back and forth over `stdout` and `stdin`, it really slows +things down. + +Thus, I propose that there be a new optional parameter to `hook` that +tells it that the function should only be called for files whose type +is the same as the id of the plugin calling `hook`. I have called +this parameter `exclusive` in my branch, but this might not be the +best name. + +[[!tag patch]] From 53276c4d674305cd00b1865c5ef719654e3cab5b Mon Sep 17 00:00:00 2001 From: "http://kerravonsen.dreamwidth.org/" Date: Fri, 10 Feb 2012 01:33:46 -0400 Subject: [PATCH 020/849] hmmmm --- doc/todo/be_more_selective_about_running_hooks.mdwn | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/todo/be_more_selective_about_running_hooks.mdwn b/doc/todo/be_more_selective_about_running_hooks.mdwn index 0c8e0b090..b57bd5c72 100644 --- a/doc/todo/be_more_selective_about_running_hooks.mdwn +++ b/doc/todo/be_more_selective_about_running_hooks.mdwn @@ -18,3 +18,7 @@ this parameter `exclusive` in my branch, but this might not be the best name. [[!tag patch]] + +> It's an interesting idea, but it might be more useful if it was more generalized, say, by making it a filter, where the parameter is a regexp. +> +> --[[KathrynAndersen]] From 68717497d3eb7a024ea0f48b60ddae98caccd81b Mon Sep 17 00:00:00 2001 From: "http://cgray.myopenid.com/" Date: Fri, 10 Feb 2012 11:16:07 -0400 Subject: [PATCH 021/849] --- doc/users/chrismgray.mdwn | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 doc/users/chrismgray.mdwn diff --git a/doc/users/chrismgray.mdwn b/doc/users/chrismgray.mdwn new file mode 100644 index 000000000..b0084830d --- /dev/null +++ b/doc/users/chrismgray.mdwn @@ -0,0 +1,4 @@ +I'm Chris Gray. I have an ikiwiki-based blog at +[[http://chrismgray.github.com]]. I wrote a plugin for +[[org-mode|todo/org_mode]] files that is probably the first ikiwiki +plugin written mostly in emacs lisp. From 8f8e7f112f0c614c42c261a5fae70efd538795e6 Mon Sep 17 00:00:00 2001 From: "http://cgray.myopenid.com/" Date: Fri, 10 Feb 2012 11:19:31 -0400 Subject: [PATCH 022/849] --- doc/todo/be_more_selective_about_running_hooks.mdwn | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/todo/be_more_selective_about_running_hooks.mdwn b/doc/todo/be_more_selective_about_running_hooks.mdwn index b57bd5c72..d9fefb981 100644 --- a/doc/todo/be_more_selective_about_running_hooks.mdwn +++ b/doc/todo/be_more_selective_about_running_hooks.mdwn @@ -22,3 +22,7 @@ best name. > It's an interesting idea, but it might be more useful if it was more generalized, say, by making it a filter, where the parameter is a regexp. > > --[[KathrynAndersen]] + +>> Would it make more sense as a pagespec? That might be a bit more hard to implement, but would certainly fix the naming issue. +>> +>> --[[chrismgray]] From 63494cff898427a5bbe1b044a4600ba46c368c8e Mon Sep 17 00:00:00 2001 From: "http://jamestechnotes.com/" Date: Fri, 10 Feb 2012 12:38:01 -0400 Subject: [PATCH 023/849] --- doc/ikiwikiusers.mdwn | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn index 96b94a163..4d7df7501 100644 --- a/doc/ikiwikiusers.mdwn +++ b/doc/ikiwikiusers.mdwn @@ -172,3 +172,4 @@ Personal sites and blogs * [SolderPad Documentation](http://docs.solderpad.com) * various sub-domains at kisikew.org ([example](https://portal.kisikew.org/)) * [Paul Elms](http://paul.elms.pro) Personal site and blog in russian. +* [James' Tech Notes](http://jamestechnotes.com) My technical notes, blog, wiki, personal site. From f1cee65538923b832cdebfabfd41e9f2cbbc1491 Mon Sep 17 00:00:00 2001 From: JoshTriplett Date: Fri, 10 Feb 2012 12:43:29 -0400 Subject: [PATCH 024/849] Perl plugins for a Haskell program? --- doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn b/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn index b6495194a..e19ceaa8f 100644 --- a/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn +++ b/doc/todo/rewrite_ikiwiki_in_haskell/discussion.mdwn @@ -55,3 +55,7 @@ href="http://jaspervdj.be/hakyll">Hakyll? >> dependency stuff. -- [[tychoish]] >>> (nods) Which is why I suggested it. I'm not sure whether it would be easier to "bolt on" those things than static compilation, but it could be worth looking at, at least. -- [[KathrynAndersen]] + +----- + +Rather than coding plugins for the Perl ikiwiki in Haskell, I wonder how easily a Haskell ikiwiki could still support plugins written in Perl? The (old and apparently stale) [HsPerl5](http://hackage.haskell.org/package/HsPerl5) package might provide a helpful starting point there. -- [[JoshTriplett]] From 204d29d9253d803fb1d03415b3f9fecbec3c82f6 Mon Sep 17 00:00:00 2001 From: "http://kerravonsen.dreamwidth.org/" Date: Fri, 10 Feb 2012 20:49:30 -0400 Subject: [PATCH 025/849] hmmm again --- doc/todo/be_more_selective_about_running_hooks.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/todo/be_more_selective_about_running_hooks.mdwn b/doc/todo/be_more_selective_about_running_hooks.mdwn index d9fefb981..8c47d4e5f 100644 --- a/doc/todo/be_more_selective_about_running_hooks.mdwn +++ b/doc/todo/be_more_selective_about_running_hooks.mdwn @@ -26,3 +26,5 @@ best name. >> Would it make more sense as a pagespec? That might be a bit more hard to implement, but would certainly fix the naming issue. >> >> --[[chrismgray]] + +>>> Considering where it would be called, a pagespec might be overkill. --[[KathrynAndersen]] From e3304d234d59a5124ec94ea91161a80cfd3078e0 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmUWmB1M35_jviFvGPYDIH-a-_Al-7OrXM" Date: Mon, 13 Feb 2012 10:14:50 -0400 Subject: [PATCH 026/849] Change suggestion to man page. --- doc/ikiwiki-calendar/discussion.mdwn | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/ikiwiki-calendar/discussion.mdwn diff --git a/doc/ikiwiki-calendar/discussion.mdwn b/doc/ikiwiki-calendar/discussion.mdwn new file mode 100644 index 000000000..0fa062413 --- /dev/null +++ b/doc/ikiwiki-calendar/discussion.mdwn @@ -0,0 +1,11 @@ +Suggestion to change + + 0 0 * * * ikiwiki-calendar ~/ikiwiki.setup "posts/* and !*/Discussion" + +to + + 0 0 * * * ikiwiki-calendar ~/ikiwiki.setup 'posts/* and !*/Discussion' + +I ran into (for me) unexpected behaviour with double quotes, since when I tried it in the interactive shell, the "!" made it fail ([history expansion](http://mywiki.wooledge.org/BashPitfalls#echo_.22Hello_World.21.22)). I thought "aha, it should be escaped!", did so, and did not get any error messages, but it no longer functioned as intended (as per the earlier linked page). + +The latter line will work everywhere, not just in environments without history expansion. I think trying a command manually before putting it into crontab is common, and this would avoid the possible user issue I ran into. From 303854564e5660b9ab00092b468039aeed641b81 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 13 Feb 2012 11:58:34 -0400 Subject: [PATCH 027/849] response --- ...be_more_selective_about_running_hooks.mdwn | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/doc/todo/be_more_selective_about_running_hooks.mdwn b/doc/todo/be_more_selective_about_running_hooks.mdwn index 8c47d4e5f..429647712 100644 --- a/doc/todo/be_more_selective_about_running_hooks.mdwn +++ b/doc/todo/be_more_selective_about_running_hooks.mdwn @@ -6,6 +6,12 @@ Normally, this means that they call `pagetype` first thing in the function, determine if they know how to deal with the content, and only do anything if they do. +> So, I can't find any plugins shipped with ikiwiki that actually do that. +> Scan hooks are only ever passed the content of actual wiki pages, and +> so unless a scan hook cares whether a page is written in markdown or +> something else, it has no reason to care what the pagetype is. (Same for +> linkify.) --[[Joey]] + This is a bit wasteful in itself, but for external plugins, it's really bad. For functions like `scan` and `linkify`, where the entire page is sent back and forth over `stdout` and `stdin`, it really slows @@ -19,12 +25,30 @@ best name. [[!tag patch]] -> It's an interesting idea, but it might be more useful if it was more generalized, say, by making it a filter, where the parameter is a regexp. +> It's an interesting idea, but it might be more useful if it was more +> generalized, say, by making it a filter, where the parameter is a regexp. > > --[[KathrynAndersen]] ->> Would it make more sense as a pagespec? That might be a bit more hard to implement, but would certainly fix the naming issue. +>> Would it make more sense as a pagespec? That might be a bit more hard +>> to implement, but would certainly fix the naming issue. >> >> --[[chrismgray]] >>> Considering where it would be called, a pagespec might be overkill. --[[KathrynAndersen]] + +>>>> Pagespecs have some overhead themselves. Probably less than shipping +>>>> the page content over stdio. +>>>> +>>>> Rather than putting filtering in the core of ikiwiki, I can think +>>>> of two options. One is to make the main plugin a perl plugin, and +>>>> have it call functions that are provided by another, external plugin. +>>>> This is assuming you're using the other language because something +>>>> is easy to do in it, not to avoid writing perl. +>>>> +>>>> Or, the external plugin interface could provide a version of `hook()` +>>>> that does not pass the content parameter, but saves a copy that +>>>> the plugin could request with a later rpc call. Assuming that +>>>> it's really the overhead of serializing the page content, that's +>>>> the problem, and not just the general overhead of making rpc calls +>>>> for every page.. --[[Joey]] From d09de3116fdca109468d949999985059765dfcc8 Mon Sep 17 00:00:00 2001 From: JoshTriplett Date: Mon, 13 Feb 2012 12:04:59 -0400 Subject: [PATCH 028/849] Support for BrowserID as an authentication plugin, ideally on by default. --- doc/todo/BrowserID.mdwn | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/todo/BrowserID.mdwn diff --git a/doc/todo/BrowserID.mdwn b/doc/todo/BrowserID.mdwn new file mode 100644 index 000000000..aa35f6660 --- /dev/null +++ b/doc/todo/BrowserID.mdwn @@ -0,0 +1,8 @@ +Please consider providing a plugin for [BrowserID](https://browserid.org/) authentication, preferably enabled by default. + +Some additional information on BrowserID: + +- https://github.com/mozilla/browserid/wiki/How-to-Use-BrowserID-on-Your-Site +- http://identity.mozilla.com/post/7616727542/introducing-browserid-a-better-way-to-sign-in +- http://identity.mozilla.com/post/7669886219/how-browserid-differs-from-openid +- http://identity.mozilla.com/post/7899984443/privacy-and-browserid From c5ba451bb561f185577b82f736671ea9fbd56b69 Mon Sep 17 00:00:00 2001 From: JoshTriplett Date: Mon, 13 Feb 2012 12:07:00 -0400 Subject: [PATCH 029/849] Linkify URLs. --- doc/todo/BrowserID.mdwn | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/todo/BrowserID.mdwn b/doc/todo/BrowserID.mdwn index aa35f6660..9340dc0f1 100644 --- a/doc/todo/BrowserID.mdwn +++ b/doc/todo/BrowserID.mdwn @@ -2,7 +2,7 @@ Please consider providing a plugin for [BrowserID](https://browserid.org/) authe Some additional information on BrowserID: -- https://github.com/mozilla/browserid/wiki/How-to-Use-BrowserID-on-Your-Site -- http://identity.mozilla.com/post/7616727542/introducing-browserid-a-better-way-to-sign-in -- http://identity.mozilla.com/post/7669886219/how-browserid-differs-from-openid -- http://identity.mozilla.com/post/7899984443/privacy-and-browserid +- +- +- +- From b514b8d2af71ca14bd0cbc895d41ed9fa30234b4 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 13 Feb 2012 12:37:08 -0400 Subject: [PATCH 030/849] response --- doc/todo/BrowserID.mdwn | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/doc/todo/BrowserID.mdwn b/doc/todo/BrowserID.mdwn index aa35f6660..f45ac34b8 100644 --- a/doc/todo/BrowserID.mdwn +++ b/doc/todo/BrowserID.mdwn @@ -6,3 +6,27 @@ Some additional information on BrowserID: - http://identity.mozilla.com/post/7616727542/introducing-browserid-a-better-way-to-sign-in - http://identity.mozilla.com/post/7669886219/how-browserid-differs-from-openid - http://identity.mozilla.com/post/7899984443/privacy-and-browserid + +> I would like to see BrowserID offered as a signin option in ikiwiki +> right next to the buttons for common openid providers. +> +> As far as implementing it goes, I don't want to rely on browserid.org. +> This means that include.js needs to be shipped with ikiwiki (or in a +> dependency in a sane world). +> +> And it means that relying on a https +> connection to browserid.org to verify the user's identity assertion +> token is out. (Well, it's probably out anyway, since it relies on https +> CA security as the only security in that part of the protocol. I'm not +> impressed by the documention using *curl* for this, which won't even +> validate the certificate AFAIK; and I don't trust https to random SPoF sites +> for security.) +> +> This seems to need an implementation, in perl or an externally callable +> program (haskell would be fine ;), +> of . +> The documentation of which is .. two cellphone snaps of a whiteboard? +> There is some kind of standalone verifier, but I have not found +> the part of the code that actually does the crypto. +> +> --[[Joey]] From b70a488b67e45ff99dfd8269cbddb5520e7d89af Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 13 Feb 2012 12:40:54 -0400 Subject: [PATCH 031/849] remove incorrect bit --- doc/todo/BrowserID.mdwn | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/doc/todo/BrowserID.mdwn b/doc/todo/BrowserID.mdwn index f45ac34b8..aafd41275 100644 --- a/doc/todo/BrowserID.mdwn +++ b/doc/todo/BrowserID.mdwn @@ -17,10 +17,7 @@ Some additional information on BrowserID: > And it means that relying on a https > connection to browserid.org to verify the user's identity assertion > token is out. (Well, it's probably out anyway, since it relies on https -> CA security as the only security in that part of the protocol. I'm not -> impressed by the documention using *curl* for this, which won't even -> validate the certificate AFAIK; and I don't trust https to random SPoF sites -> for security.) +> CA security as the only security in that part of the protocol.) > > This seems to need an implementation, in perl or an externally callable > program (haskell would be fine ;), From 24bdab75e379c5a542d9e07bc0997ee16cef992d Mon Sep 17 00:00:00 2001 From: "http://cgray.myopenid.com/" Date: Mon, 13 Feb 2012 13:43:06 -0400 Subject: [PATCH 032/849] --- .../be_more_selective_about_running_hooks.mdwn | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/todo/be_more_selective_about_running_hooks.mdwn b/doc/todo/be_more_selective_about_running_hooks.mdwn index 429647712..70a1cb7a2 100644 --- a/doc/todo/be_more_selective_about_running_hooks.mdwn +++ b/doc/todo/be_more_selective_about_running_hooks.mdwn @@ -12,6 +12,11 @@ only do anything if they do. > something else, it has no reason to care what the pagetype is. (Same for > linkify.) --[[Joey]] +>> My [[org-mode|todo/org_mode]] external plugin (which will never +>> really make sense to include with ikiwiki I think) does this. I +>> think that most plugins defining alternate wiki syntaxes would as +>> well. --[[chrismgray]] + This is a bit wasteful in itself, but for external plugins, it's really bad. For functions like `scan` and `linkify`, where the entire page is sent back and forth over `stdout` and `stdin`, it really slows @@ -52,3 +57,12 @@ best name. >>>> it's really the overhead of serializing the page content, that's >>>> the problem, and not just the general overhead of making rpc calls >>>> for every page.. --[[Joey]] + +>>>>> Since the argument to `hook` is optional, the pagespec is only +>>>>> interpreted if it is given. So there is no extra overhead +>>>>> (beyond an unused `if` branch) in 99% of the cases. +>>>>> +>>>>> Rewriting the external plugin's shim using Perl is a good idea, +>>>>> and one that I wish I had thought of earlier. On the other +>>>>> hand, it doesn't set a great precedent about the usability of +>>>>> external plugins. --[[chrismgray]] From 3d6cb667aafa175819ffcec86930eef3621c8b04 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmmty-QrKVaEh42EoB_-YkX10dUlrlitEc" Date: Thu, 16 Feb 2012 10:13:51 -0400 Subject: [PATCH 033/849] --- doc/plugins/sidebar/discussion.mdwn | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/plugins/sidebar/discussion.mdwn b/doc/plugins/sidebar/discussion.mdwn index eb441529c..b9ab36fb1 100644 --- a/doc/plugins/sidebar/discussion.mdwn +++ b/doc/plugins/sidebar/discussion.mdwn @@ -3,3 +3,8 @@ I tried exactly that, namely having an inline in my sidebar to include an rss feed from some other side. I think the complete wiki rebuild should be doable every few days when a new article appears in that feed. But contrary to that warning there is no complete wiki rebuild, only the sidebar page is rebuilt by the "ikiwiki --aggregate" from cron. Is that a bug or a feature? > It's a bug, discussed in [[bugs/transitive_dependencies]]. --[[Joey]] + +I needed to include inline directives into sidebars at different site sections to generate a dynamically updated navigation - very nice when combined with toggles - and I ran into the very same problem. I tried the map directive instead, but found I wouldn't like to re-style everything and also was missing the show=title variable giving me meta titles of some pages that make use of it. Then I came across the tip to include the quick=yes variable, described thatr it wouldn't show page titles included with the meta-directive, and I thought, well if it lets me have it only this way, maybe I can restrain from using meta titles. +But to my surprise, even with the quick=yes variable included into the inline in the sidebars meta titles still are shown, which is amazing, but maybe it should be noted somewhere. One more time ikiwiki showed its bright face, thank you. + +Boris From f8e17ccc558116387dffa5d484e1503d49d03f7c Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmmty-QrKVaEh42EoB_-YkX10dUlrlitEc" Date: Thu, 16 Feb 2012 10:14:18 -0400 Subject: [PATCH 034/849] --- doc/plugins/sidebar/discussion.mdwn | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/plugins/sidebar/discussion.mdwn b/doc/plugins/sidebar/discussion.mdwn index b9ab36fb1..192baa3f8 100644 --- a/doc/plugins/sidebar/discussion.mdwn +++ b/doc/plugins/sidebar/discussion.mdwn @@ -5,6 +5,4 @@ I tried exactly that, namely having an inline in my sidebar to include an rss fe > It's a bug, discussed in [[bugs/transitive_dependencies]]. --[[Joey]] I needed to include inline directives into sidebars at different site sections to generate a dynamically updated navigation - very nice when combined with toggles - and I ran into the very same problem. I tried the map directive instead, but found I wouldn't like to re-style everything and also was missing the show=title variable giving me meta titles of some pages that make use of it. Then I came across the tip to include the quick=yes variable, described thatr it wouldn't show page titles included with the meta-directive, and I thought, well if it lets me have it only this way, maybe I can restrain from using meta titles. -But to my surprise, even with the quick=yes variable included into the inline in the sidebars meta titles still are shown, which is amazing, but maybe it should be noted somewhere. One more time ikiwiki showed its bright face, thank you. - -Boris +But to my surprise, even with the quick=yes variable included into the inline in the sidebars meta titles still are shown, which is amazing, but maybe it should be noted somewhere. One more time ikiwiki showed its bright face, thank you. --Boris From ef94fa192adedd47978b4c7f8f317d343ca46913 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmmty-QrKVaEh42EoB_-YkX10dUlrlitEc" Date: Thu, 16 Feb 2012 10:17:15 -0400 Subject: [PATCH 035/849] --- doc/plugins/sidebar/discussion.mdwn | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/plugins/sidebar/discussion.mdwn b/doc/plugins/sidebar/discussion.mdwn index 192baa3f8..423ab5bbf 100644 --- a/doc/plugins/sidebar/discussion.mdwn +++ b/doc/plugins/sidebar/discussion.mdwn @@ -4,5 +4,7 @@ I tried exactly that, namely having an inline in my sidebar to include an rss fe > It's a bug, discussed in [[bugs/transitive_dependencies]]. --[[Joey]] -I needed to include inline directives into sidebars at different site sections to generate a dynamically updated navigation - very nice when combined with toggles - and I ran into the very same problem. I tried the map directive instead, but found I wouldn't like to re-style everything and also was missing the show=title variable giving me meta titles of some pages that make use of it. Then I came across the tip to include the quick=yes variable, described thatr it wouldn't show page titles included with the meta-directive, and I thought, well if it lets me have it only this way, maybe I can restrain from using meta titles. -But to my surprise, even with the quick=yes variable included into the inline in the sidebars meta titles still are shown, which is amazing, but maybe it should be noted somewhere. One more time ikiwiki showed its bright face, thank you. --Boris +I needed to include inline directives into sidebars at different site sections to generate a dynamically updated navigation - very nice when combined with toggles - and I ran into the very same problem. I tried the map directive instead, but found I wouldn't like to re-style everything and also was missing the show=title variable giving me meta titles of some pages that make use of it. + +Then I came across the tip to include the quick=yes variable with the inline directive, where it is described as not showing page titles included with the meta-directive, and I thought, well if it lets me have it only this way, maybe I can restrain from using meta titles. +But to my surprise, even with the quick=yes variable included into the inline directive in the sidebars meta titles still are shown, no more forced rebuild when editing via cgi, which is amazing, but maybe it should be noted somewhere. One more time ikiwiki showed its bright face, thank you. --Boris From c5d924c55d25440d457bde5d16ec5488536b3282 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmmty-QrKVaEh42EoB_-YkX10dUlrlitEc" Date: Thu, 16 Feb 2012 10:19:49 -0400 Subject: [PATCH 036/849] --- doc/plugins/sidebar/discussion.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/plugins/sidebar/discussion.mdwn b/doc/plugins/sidebar/discussion.mdwn index 423ab5bbf..42bc6a3e1 100644 --- a/doc/plugins/sidebar/discussion.mdwn +++ b/doc/plugins/sidebar/discussion.mdwn @@ -4,7 +4,7 @@ I tried exactly that, namely having an inline in my sidebar to include an rss fe > It's a bug, discussed in [[bugs/transitive_dependencies]]. --[[Joey]] -I needed to include inline directives into sidebars at different site sections to generate a dynamically updated navigation - very nice when combined with toggles - and I ran into the very same problem. I tried the map directive instead, but found I wouldn't like to re-style everything and also was missing the show=title variable giving me meta titles of some pages that make use of it. +I needed to include inline directives into sidebars at different site sections to generate a dynamically updated navigation - very nice when combined with toggles - and I ran into the very same problem. I tried the map directive instead, but found I wouldn't like to re-style everything and also was missing the ability to make use of the show=title variable giving me meta titles where needed without taking the cost of rebuild with every page edit. Then I came across the tip to include the quick=yes variable with the inline directive, where it is described as not showing page titles included with the meta-directive, and I thought, well if it lets me have it only this way, maybe I can restrain from using meta titles. But to my surprise, even with the quick=yes variable included into the inline directive in the sidebars meta titles still are shown, no more forced rebuild when editing via cgi, which is amazing, but maybe it should be noted somewhere. One more time ikiwiki showed its bright face, thank you. --Boris From d17cf8e658bc8ff5516446103f85dd1aff353845 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk_dxcOgWQT1XNABaAjIHF3vRFSksODrW0" Date: Thu, 16 Feb 2012 12:24:10 -0400 Subject: [PATCH 037/849] fix single dash --- doc/ikiwiki-makerepo.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ikiwiki-makerepo.mdwn b/doc/ikiwiki-makerepo.mdwn index eccfb692a..928440f99 100644 --- a/doc/ikiwiki-makerepo.mdwn +++ b/doc/ikiwiki-makerepo.mdwn @@ -12,7 +12,7 @@ ikiwiki-makerepo bzr|mercurial srcdir `ikiwiki-makerepo` injects an existing `srcdir` directory, containing sources for an ikiwiki wiki, into revision control. It is rarely -run directly; consider using `ikiwiki -setup /etc/ikiwiki/wiki.setup` instead +run directly; consider using `ikiwiki --setup /etc/ikiwiki/wiki.setup` instead to set up a wiki. For git, the `repo` is created as a bare git repository, and the srcdir is From 90796a3285b9ee0cb0e678847a8b0539e8f860cf Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk-b16zEKvUn_sHxIvCoo9aj_bR9iXOJGk" Date: Thu, 16 Feb 2012 20:40:15 -0400 Subject: [PATCH 038/849] --- doc/ikiwikiusers.mdwn | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn index 4d7df7501..3bf3f3fff 100644 --- a/doc/ikiwikiusers.mdwn +++ b/doc/ikiwikiusers.mdwn @@ -102,6 +102,7 @@ Personal sites and blogs * [Keith Packard's homepage and blog](http://keithp.com/). * [Christian Mock's homepage](http://www.tahina.priv.at/). * [Choffee](http://choffee.co.uk/). +* [Salient Dream](http://www.salientdream.com/) All Things Strange. * [Tales from the Gryphon](http://www.golden-gryphon.com/blog/manoj/), Manoj Srivastava's free software blog. * [Proper Treatment 正當作法](http://conway.rutgers.edu/~ccshan/wiki/) * [lost scraps](http://web.mornfall.net), pages/blog of Petr Ročkai aka mornfall From 2cc07710aad89b66815ff11df52cd5f7de34baea Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk-b16zEKvUn_sHxIvCoo9aj_bR9iXOJGk" Date: Thu, 16 Feb 2012 20:41:12 -0400 Subject: [PATCH 039/849] --- doc/ikiwikiusers.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn index 3bf3f3fff..0e2f903e8 100644 --- a/doc/ikiwikiusers.mdwn +++ b/doc/ikiwikiusers.mdwn @@ -102,7 +102,6 @@ Personal sites and blogs * [Keith Packard's homepage and blog](http://keithp.com/). * [Christian Mock's homepage](http://www.tahina.priv.at/). * [Choffee](http://choffee.co.uk/). -* [Salient Dream](http://www.salientdream.com/) All Things Strange. * [Tales from the Gryphon](http://www.golden-gryphon.com/blog/manoj/), Manoj Srivastava's free software blog. * [Proper Treatment 正當作法](http://conway.rutgers.edu/~ccshan/wiki/) * [lost scraps](http://web.mornfall.net), pages/blog of Petr Ročkai aka mornfall @@ -174,3 +173,4 @@ Personal sites and blogs * various sub-domains at kisikew.org ([example](https://portal.kisikew.org/)) * [Paul Elms](http://paul.elms.pro) Personal site and blog in russian. * [James' Tech Notes](http://jamestechnotes.com) My technical notes, blog, wiki, personal site. +* [Salient Dream](http://www.salientdream.com/) All Things Strange. From f612200d8e53f3ee69e825361d6daf82ff62c7ed Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk-b16zEKvUn_sHxIvCoo9aj_bR9iXOJGk" Date: Thu, 16 Feb 2012 20:42:12 -0400 Subject: [PATCH 040/849] --- doc/ikiwikiusers.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn index 0e2f903e8..4695514d9 100644 --- a/doc/ikiwikiusers.mdwn +++ b/doc/ikiwikiusers.mdwn @@ -173,4 +173,4 @@ Personal sites and blogs * various sub-domains at kisikew.org ([example](https://portal.kisikew.org/)) * [Paul Elms](http://paul.elms.pro) Personal site and blog in russian. * [James' Tech Notes](http://jamestechnotes.com) My technical notes, blog, wiki, personal site. -* [Salient Dream](http://www.salientdream.com/) All Things Strange. +* [Salient Dream](http://www.salientdream.com/) - All Things Strange. From b92a8d4f86a4b566e2ea559e80d916acffffd554 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Thu, 16 Feb 2012 23:24:13 -0400 Subject: [PATCH 041/849] --- doc/plugins/contrib/osm.mdwn | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 doc/plugins/contrib/osm.mdwn diff --git a/doc/plugins/contrib/osm.mdwn b/doc/plugins/contrib/osm.mdwn new file mode 100644 index 000000000..b15453e0c --- /dev/null +++ b/doc/plugins/contrib/osm.mdwn @@ -0,0 +1,6 @@ +Primitive Openstreetmap/Openlayers support for ikiwiki +------------------------------------------------------ + +This plugin provides simple Openstreetmap/Openlayers support for ikiwiki. It uses a static .html map and links to it, generating a CSV-style POI list. + +Plugin was originally written by [[the techno-viking|http://techno-viking.com/posts/ikiwiki-maps/]] and fixed up by [[anarcat]]. Code is available at `git://src.anarcat.ath.cx/ikiwiki-osm.git`. From f9ecc4c4c964c84fb45bd567ee3dbe8f18e40921 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Thu, 16 Feb 2012 23:32:29 -0400 Subject: [PATCH 042/849] --- doc/plugins/contrib/googlemaps.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/plugins/contrib/googlemaps.mdwn b/doc/plugins/contrib/googlemaps.mdwn index 953f296ab..9d21a6b7a 100644 --- a/doc/plugins/contrib/googlemaps.mdwn +++ b/doc/plugins/contrib/googlemaps.mdwn @@ -17,3 +17,5 @@ can be calculated automatically. It can be [found here][3]. [3]: http://www.tahina.priv.at/hacks/googlemaps.html + +See also [[plugins/contrib/osm]]. From 38526059e06f34dc03b297a598bebb33f267793c Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Thu, 16 Feb 2012 23:32:54 -0400 Subject: [PATCH 043/849] --- doc/plugins/contrib/osm.mdwn | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/plugins/contrib/osm.mdwn b/doc/plugins/contrib/osm.mdwn index b15453e0c..f75cb2506 100644 --- a/doc/plugins/contrib/osm.mdwn +++ b/doc/plugins/contrib/osm.mdwn @@ -1,6 +1,12 @@ +[[!template id=plugin name=osm author="Blars Blarson"]] +[[!tag type/special-purpose todo/geotagging]] + Primitive Openstreetmap/Openlayers support for ikiwiki ------------------------------------------------------ This plugin provides simple Openstreetmap/Openlayers support for ikiwiki. It uses a static .html map and links to it, generating a CSV-style POI list. Plugin was originally written by [[the techno-viking|http://techno-viking.com/posts/ikiwiki-maps/]] and fixed up by [[anarcat]]. Code is available at `git://src.anarcat.ath.cx/ikiwiki-osm.git`. + +See also [[plugins/contrib/googlemaps]]. + From 5f4945d40f1fe6a6b7782b9444e85f139a1d9fbd Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Fri, 17 Feb 2012 02:51:56 -0400 Subject: [PATCH 044/849] update the status here, this actually works fairly well --- doc/plugins/contrib/osm.mdwn | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/plugins/contrib/osm.mdwn b/doc/plugins/contrib/osm.mdwn index f75cb2506..de0623da9 100644 --- a/doc/plugins/contrib/osm.mdwn +++ b/doc/plugins/contrib/osm.mdwn @@ -1,10 +1,10 @@ -[[!template id=plugin name=osm author="Blars Blarson"]] +[[!template id=plugin name=osm author="Blars Blarson, Antoine Beaupré"]] [[!tag type/special-purpose todo/geotagging]] -Primitive Openstreetmap/Openlayers support for ikiwiki ------------------------------------------------------- +Openstreetmap/Openlayers support for ikiwiki +-------------------------------------------- -This plugin provides simple Openstreetmap/Openlayers support for ikiwiki. It uses a static .html map and links to it, generating a CSV-style POI list. +This plugin provides simple Openstreetmap/Openlayers support for ikiwiki. It can embed Openstreetmap viewports within a page or link to a bigger map that will have multiple markers, generated with a CSV-style POI list based on the different calling pages. Multiple distinct maps on a single wiki are supported. Plugin was originally written by [[the techno-viking|http://techno-viking.com/posts/ikiwiki-maps/]] and fixed up by [[anarcat]]. Code is available at `git://src.anarcat.ath.cx/ikiwiki-osm.git`. From badbe8aae3adecf4efba41dc6858b49c7fed633d Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik" Date: Fri, 17 Feb 2012 03:56:20 -0400 Subject: [PATCH 045/849] webmasters.stackexchange.com --- doc/todo/pdf_output.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/todo/pdf_output.mdwn b/doc/todo/pdf_output.mdwn index 29c89e4eb..a0f324054 100644 --- a/doc/todo/pdf_output.mdwn +++ b/doc/todo/pdf_output.mdwn @@ -18,3 +18,5 @@ Note that for example dokuwiki has a [[nice plugin|http://danjer.doudouke.org/te >>>>> Have you tried running it with "verbose" turned on, and noting the output? That could give some clues. >>>>> And no, the PDFs are not placed in the source dir, only in the destination dir. >>>>> -- [[KathrynAndersen]] + +**Edit (17.02.2012)**: I have put an extended version of the question on webmasters.stackexchange: [[http://webmasters.stackexchange.com/questions/24905/run-external-application-on-markdown-source-in-ikiwiki]] , perhaps someone of the ikiwiki programmers is intersted in having this feature too... From 7bc9bc7812701d236e16f6da8b2215114a66e31c Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 18 Feb 2012 13:32:26 -0400 Subject: [PATCH 046/849] note KML and GeoJSON support --- doc/plugins/contrib/osm.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/plugins/contrib/osm.mdwn b/doc/plugins/contrib/osm.mdwn index de0623da9..cee6be0c7 100644 --- a/doc/plugins/contrib/osm.mdwn +++ b/doc/plugins/contrib/osm.mdwn @@ -4,7 +4,7 @@ Openstreetmap/Openlayers support for ikiwiki -------------------------------------------- -This plugin provides simple Openstreetmap/Openlayers support for ikiwiki. It can embed Openstreetmap viewports within a page or link to a bigger map that will have multiple markers, generated with a CSV-style POI list based on the different calling pages. Multiple distinct maps on a single wiki are supported. +This plugin provides simple Openstreetmap/Openlayers support for ikiwiki. It can embed Openstreetmap viewports within a page or link to a bigger map that will have multiple markers, generated with a KML (or CSV, or GeoJSON) datafile of markers based on the different calling pages. Multiple distinct maps on a single wiki are supported. Plugin was originally written by [[the techno-viking|http://techno-viking.com/posts/ikiwiki-maps/]] and fixed up by [[anarcat]]. Code is available at `git://src.anarcat.ath.cx/ikiwiki-osm.git`. From 33e712b78e5fbb93bc0200e96d6bff6869b9856f Mon Sep 17 00:00:00 2001 From: Paul Menzel Date: Sun, 19 Feb 2012 20:44:23 +0100 Subject: [PATCH 047/849] Bug#660549: ikiwiki: [PATCH] openid-jquery.js: Update URL of Wordpress favicon From a3041e786fe9e09110218e83e996fe688f8376ea Mon Sep 17 00:00:00 2001 From: Paul Menzel Date: Sun, 19 Feb 2012 16:05:33 +0100 Subject: [PATCH] openid-jquery.js: Update URL of Wordpress favicon The URL for the favicon for Wordpress in the OpenID login page [1] is not valid anymore and gives the following access denied error. AccessDeniedAccess DeniedC2BF55AE9F76A487FFmvol84V82UR34uxP1N7pDNGSLWS0QDtLBsP5JKj0GcU//C3jm3TftcIcGzFBbh Looking at the Wordpress site I found a different URL for the favicon [2]. The other URLs only use non-secured HTTP access and therefore I only took the http version, although I do not know about the downsides. [1] https://ddgw.s3.amazonaws.com/wordpress.org.ico [2] http://s2.wp.com/i/favicon.ico --- underlays/openid-selector/ikiwiki/openid/openid-jquery.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/underlays/openid-selector/ikiwiki/openid/openid-jquery.js b/underlays/openid-selector/ikiwiki/openid/openid-jquery.js index c59be1edc..056110384 100644 --- a/underlays/openid-selector/ikiwiki/openid/openid-jquery.js +++ b/underlays/openid-selector/ikiwiki/openid/openid-jquery.js @@ -38,7 +38,7 @@ var providers_small = { }, wordpress: { name: 'Wordpress', - icon: 'https://ddgw.s3.amazonaws.com/wordpress.org.ico', + icon: 'https://s2.wp.com/i/favicon.ico', label: 'Enter your Wordpress.com username:', url: 'http://{username}.wordpress.com/' }, From da0df8b40fd504b4aacc842cbf41e8ff7689f340 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 19 Feb 2012 19:27:25 -0400 Subject: [PATCH 048/849] changelog --- debian/changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/changelog b/debian/changelog index 7eb34f8fe..2d9ffdb85 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,7 @@ ikiwiki (3.20120203) UNRELEASED; urgency=low * Fix a snail mail address. Closes: #659158 + * openid-jquery.js: Update URL of Wordpress favicon. Closes: #660549 -- Joey Hess Wed, 08 Feb 2012 16:07:00 -0400 From 0312eb59674272d6de05ca0d4fe0748e90fbf6f5 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sun, 19 Feb 2012 20:43:15 -0400 Subject: [PATCH 049/849] --- .../internal_definition_list_support.mdwn | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 doc/todo/internal_definition_list_support.mdwn diff --git a/doc/todo/internal_definition_list_support.mdwn b/doc/todo/internal_definition_list_support.mdwn new file mode 100644 index 000000000..4348e76f8 --- /dev/null +++ b/doc/todo/internal_definition_list_support.mdwn @@ -0,0 +1,37 @@ +While ikiwiki can support definition lists (`dl/dt/dd`) through [[multimarkdown|mdwn]], it doesn't actually /do/ anything with those valuable definitions. It would be interesting for third party plugins to have access to this stuff as a proper data structure. This is what allows MoinMoin to have plugins that collect that data across multiple pages and tabulate it, for example. + +What I am proposing here is that the [[variables exported to plugins|plugins/write/#index6h2]] be extended to include a `%dictionnaries` hash. For a markup like this: + +[[!format txt """ +Apple +: Apple is a fruit +: It's also a computer company +Orange +: Orange is a fruit +"""]] + +would result in a data structure like this: + +[[!format txt """ +%dicts = { + 'Apple' => [ "Apple is a fruit", "It's also a computer company" ], + 'Orange' => [ "Orange is a fruit" ], +} +"""]] + +Now, I know I can write myself a `format()` parser that would do this on all pages in my own plugin, but then it would need to be adapted to all markups, while markup formatters should be the ones implementing this directly, if possible. + +My first use case for this would be to extend the [[plugins/contrib/osm]] plugin to tap into those lists, so that I could have this data in the page, visible to the user: + +[[!format txt """ +Longitude +: -45.30 +Latitude +: 73.67 +"""]] + +and then reuse that data in the plugin. + +Then for us running the humongous [[koumbit wiki|https://wiki.koumbit.net/]], it is a necessary step to be able to migrate away from MoinMoin to Ikiwiki as we have a lot of pages that tabulate information like this. For example, see our [[ServerList|https://wiki.koumbit.net/ServerList]] ([[source|https://wiki.koumbit.net/ServerList?action=raw]]), being generated from pages like [[this one|https://wiki.koumbit.net/metis.koumbit.net]]. + +If there are no objections to that concept, I may try to start coding patches. Otherwise this is really just a [[wishlist]]. From 42134152faec7608c503e91199a516822aef2006 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sun, 19 Feb 2012 20:51:27 -0400 Subject: [PATCH 050/849] --- doc/plugins/contrib/osm.mdwn | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/plugins/contrib/osm.mdwn b/doc/plugins/contrib/osm.mdwn index cee6be0c7..2ef20c8ab 100644 --- a/doc/plugins/contrib/osm.mdwn +++ b/doc/plugins/contrib/osm.mdwn @@ -10,3 +10,4 @@ Plugin was originally written by [[the techno-viking|http://techno-viking.com/po See also [[plugins/contrib/googlemaps]]. +This plugin would be greatly improved by [[todo/internal_definition_list_support]]. From f450b7ce99a782222545831b3280b2b3e826e573 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sun, 19 Feb 2012 21:09:40 -0400 Subject: [PATCH 051/849] link to the readme --- doc/plugins/contrib/osm.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/plugins/contrib/osm.mdwn b/doc/plugins/contrib/osm.mdwn index 2ef20c8ab..098170a1a 100644 --- a/doc/plugins/contrib/osm.mdwn +++ b/doc/plugins/contrib/osm.mdwn @@ -6,7 +6,7 @@ Openstreetmap/Openlayers support for ikiwiki This plugin provides simple Openstreetmap/Openlayers support for ikiwiki. It can embed Openstreetmap viewports within a page or link to a bigger map that will have multiple markers, generated with a KML (or CSV, or GeoJSON) datafile of markers based on the different calling pages. Multiple distinct maps on a single wiki are supported. -Plugin was originally written by [[the techno-viking|http://techno-viking.com/posts/ikiwiki-maps/]] and fixed up by [[anarcat]]. Code is available at `git://src.anarcat.ath.cx/ikiwiki-osm.git`. +Plugin was originally written by [[the techno-viking|http://techno-viking.com/posts/ikiwiki-maps/]] and fixed up by [[anarcat]]. Code is available at `git://src.anarcat.ath.cx/ikiwiki-osm.git`. See [[this page|http://anarcat.ath.cx/software/ikiwiki-osm/README]] for a more complete description. See also [[plugins/contrib/googlemaps]]. From 40ad087b339942c677728518587f99c9d3b723d1 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sun, 19 Feb 2012 21:13:16 -0400 Subject: [PATCH 052/849] --- doc/plugins/contrib/osm.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/plugins/contrib/osm.mdwn b/doc/plugins/contrib/osm.mdwn index 098170a1a..a4ddbcb37 100644 --- a/doc/plugins/contrib/osm.mdwn +++ b/doc/plugins/contrib/osm.mdwn @@ -6,7 +6,7 @@ Openstreetmap/Openlayers support for ikiwiki This plugin provides simple Openstreetmap/Openlayers support for ikiwiki. It can embed Openstreetmap viewports within a page or link to a bigger map that will have multiple markers, generated with a KML (or CSV, or GeoJSON) datafile of markers based on the different calling pages. Multiple distinct maps on a single wiki are supported. -Plugin was originally written by [[the techno-viking|http://techno-viking.com/posts/ikiwiki-maps/]] and fixed up by [[anarcat]]. Code is available at `git://src.anarcat.ath.cx/ikiwiki-osm.git`. See [[this page|http://anarcat.ath.cx/software/ikiwiki-osm/README]] for a more complete description. +Plugin was originally written by [[the techno-viking|http://techno-viking.com/posts/ikiwiki-maps/]] and fixed up by [[anarcat]]. Code is available at `git://src.anarcat.ath.cx/ikiwiki-osm.git`. See [[this page|http://anarcat.ath.cx/software/ikiwiki-osm/README]] for a more complete description and [[the Mtl-mesh wiki|http://mesh.openisp.ca/nodes/anarcat]] for a sample of what this plugin can do. See also [[plugins/contrib/googlemaps]]. From b530e8be09f9011ff058bc27a4da276905b8f583 Mon Sep 17 00:00:00 2001 From: "http://kerravonsen.dreamwidth.org/" Date: Sun, 19 Feb 2012 21:30:07 -0400 Subject: [PATCH 053/849] pointing out the existence of field --- doc/todo/internal_definition_list_support.mdwn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/todo/internal_definition_list_support.mdwn b/doc/todo/internal_definition_list_support.mdwn index 4348e76f8..4550e4e32 100644 --- a/doc/todo/internal_definition_list_support.mdwn +++ b/doc/todo/internal_definition_list_support.mdwn @@ -35,3 +35,6 @@ and then reuse that data in the plugin. Then for us running the humongous [[koumbit wiki|https://wiki.koumbit.net/]], it is a necessary step to be able to migrate away from MoinMoin to Ikiwiki as we have a lot of pages that tabulate information like this. For example, see our [[ServerList|https://wiki.koumbit.net/ServerList]] ([[source|https://wiki.koumbit.net/ServerList?action=raw]]), being generated from pages like [[this one|https://wiki.koumbit.net/metis.koumbit.net]]. If there are no objections to that concept, I may try to start coding patches. Otherwise this is really just a [[wishlist]]. + +> Have you looked at the [[plugins/contrib/field]] plugin? This gives you the infrastructure, and all you need is to write a plugin that parses the definition list format. Then you could use [[plugins/contrib/getfield]], [[plugins/contrib/ftemplate]] and/or [[plugins/contrib/report]] to do what you like with the data. +> --[[KathrynAndersen]] From af96c082ee556cb2e110e67f32a901bbe84b0a76 Mon Sep 17 00:00:00 2001 From: testzar Date: Mon, 20 Feb 2012 05:59:29 -0400 Subject: [PATCH 054/849] code block test --- doc/sandbox.mdwn | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index c3fb32b30..be6abdbde 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -116,6 +116,13 @@ Now we try to write a "code" block starting with a hash sign $ another test +Oh, let's try to do the same thing using sane syntax instead: + +~~~ +# test 1,2,3 +$ another test +~~~ + Now let's write the same block, with a bullest list preceding it. From 950a45ec7709203716db3df0dea29fb0f236b773 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk8xAM2eNwroSSl-Pb9eqkb9apWStenU2U" Date: Mon, 20 Feb 2012 07:23:46 -0400 Subject: [PATCH 055/849] --- doc/sandbox.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index be6abdbde..6d589e33b 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -1,7 +1,7 @@ # Sandbox [[!pagestats pages="/tags/*"]] - +ttt [[!sidebar content="dfdsfsf"" This is my custom sidebar for this page. From 0726ac642068429d86f548c66904f087f7b2ffa6 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk8xAM2eNwroSSl-Pb9eqkb9apWStenU2U" Date: Mon, 20 Feb 2012 07:24:39 -0400 Subject: [PATCH 056/849] --- doc/sandbox.mdwn | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index 6d589e33b..47785d0bf 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -1,6 +1,7 @@ # Sandbox [[!pagestats pages="/tags/*"]] +<<<<<<< HEAD ttt [[!sidebar content="dfdsfsf"" This is my custom sidebar for this page. From 045d64720475bf004fad45bbaa258b7c34984c45 Mon Sep 17 00:00:00 2001 From: spalax Date: Mon, 20 Feb 2012 17:29:42 -0400 Subject: [PATCH 057/849] Question an proposition about relevance of `ikiwiki-calendar` --- doc/ikiwiki-calendar/discussion.mdwn | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/ikiwiki-calendar/discussion.mdwn b/doc/ikiwiki-calendar/discussion.mdwn index 0fa062413..1b01761c8 100644 --- a/doc/ikiwiki-calendar/discussion.mdwn +++ b/doc/ikiwiki-calendar/discussion.mdwn @@ -9,3 +9,13 @@ to I ran into (for me) unexpected behaviour with double quotes, since when I tried it in the interactive shell, the "!" made it fail ([history expansion](http://mywiki.wooledge.org/BashPitfalls#echo_.22Hello_World.21.22)). I thought "aha, it should be escaped!", did so, and did not get any error messages, but it no longer functioned as intended (as per the earlier linked page). The latter line will work everywhere, not just in environments without history expansion. I think trying a command manually before putting it into crontab is common, and this would avoid the possible user issue I ran into. + +---- + +I wonder what this program (ikiwiki-calendar) is useful for. Would not it be simpler to have the [[calendar|ikiwiki/directive/calendar]] directive generate the `archive_base/year/month.mdwn` files on the fly, as are the tag pages generated by the [[tag|plugins/tag]] plugin? This solution would have the advantage of automatically generating the right calendar pages, instead of having to tell ikiwiki-calendar which years to take into account. + +Using this solution would mean to have the pagespec stored somewhere in the configuration. But this is already the case, as the pagespec used by [[ikiwiki-calendar]] is either set in the configuration file of the wiki, or in the crontab or whatever script used to call ikiwiki-calendar. + +Having done this, the only purpose of ikiwiki-calendar would be to re-generate the wiki on a daily (or whatever frequency) basis, which can be done using ikiwiki instead of ikiwiki-calendar. + +Did I miss something? If I am right, I offer to write the necessary patch, copied and adapted from the tag plugin, to generate the pages `archive_base/year/month.mdwn` on the fly. From 29ac3084bb4ba409ba2ad695690ebcb31497cfed Mon Sep 17 00:00:00 2001 From: spalax Date: Mon, 20 Feb 2012 17:30:41 -0400 Subject: [PATCH 058/849] =?UTF-8?q?Forgot=20to=20sign=20my=20message?= =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/ikiwiki-calendar/discussion.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/ikiwiki-calendar/discussion.mdwn b/doc/ikiwiki-calendar/discussion.mdwn index 1b01761c8..fc80470fc 100644 --- a/doc/ikiwiki-calendar/discussion.mdwn +++ b/doc/ikiwiki-calendar/discussion.mdwn @@ -19,3 +19,5 @@ Using this solution would mean to have the pagespec stored somewhere in the conf Having done this, the only purpose of ikiwiki-calendar would be to re-generate the wiki on a daily (or whatever frequency) basis, which can be done using ikiwiki instead of ikiwiki-calendar. Did I miss something? If I am right, I offer to write the necessary patch, copied and adapted from the tag plugin, to generate the pages `archive_base/year/month.mdwn` on the fly. + +-- Spalax From 498883cc1e82dcdbeb02f6f2776461668c312957 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 21 Feb 2012 13:10:25 -0400 Subject: [PATCH 059/849] response --- doc/ikiwiki-calendar/discussion.mdwn | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/ikiwiki-calendar/discussion.mdwn b/doc/ikiwiki-calendar/discussion.mdwn index fc80470fc..b64321008 100644 --- a/doc/ikiwiki-calendar/discussion.mdwn +++ b/doc/ikiwiki-calendar/discussion.mdwn @@ -21,3 +21,16 @@ Having done this, the only purpose of ikiwiki-calendar would be to re-generate t Did I miss something? If I am right, I offer to write the necessary patch, copied and adapted from the tag plugin, to generate the pages `archive_base/year/month.mdwn` on the fly. -- Spalax + +> Good spotting, `ikiwiki-calendar` predates the `add_autofile` API used to +> autocreate tag pages and was bolted in as an easy way to create calendar +> pages. +> +> It would be possible to do that inside the caneldar plugin now. Although +> some command would still need to be run on a daily (or weekly, or +> monthly, or yearly..) basis to have it wake up and make the new calendar +> pages and update the displayed current day from calendar directives. +> +> That last is, arguably, the real point of running ikiwiki-calendar in +> a cron job. Of course all it really does is run `ikiwiki -setup foo +> -refresh`. --[[Joey]] From 1a7f29cab6c9090003ed76ae23e3a748d5597caf Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 21 Feb 2012 13:10:59 -0400 Subject: [PATCH 060/849] change quoting to work around some shell problem --- doc/ikiwiki-calendar.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ikiwiki-calendar.mdwn b/doc/ikiwiki-calendar.mdwn index 03cbdd86c..d311a1859 100644 --- a/doc/ikiwiki-calendar.mdwn +++ b/doc/ikiwiki-calendar.mdwn @@ -39,7 +39,7 @@ the calendars to highlight the current day. An example crontab: - 0 0 * * * ikiwiki-calendar ~/ikiwiki.setup "posts/* and !*/Discussion" + 0 0 * * * ikiwiki-calendar ~/ikiwiki.setup 'posts/* and !*/Discussion' # TEMPLATES From ee975178b8befa0bfdc866c54bc3bfb64f570be2 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 21 Feb 2012 13:13:37 -0400 Subject: [PATCH 061/849] make a proper wikilink you know, backlinks are nice.. --- doc/forum/Calendar:_listing_multiple_entries_per_day.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/forum/Calendar:_listing_multiple_entries_per_day.mdwn b/doc/forum/Calendar:_listing_multiple_entries_per_day.mdwn index 51c320067..ebea43697 100644 --- a/doc/forum/Calendar:_listing_multiple_entries_per_day.mdwn +++ b/doc/forum/Calendar:_listing_multiple_entries_per_day.mdwn @@ -4,7 +4,7 @@ I'd very much like to be able to list my blog posts on a daily basis (used for l There was some effort to do this as detailed here. -[[http://ikiwiki.info/todo/Set_arbitrary_date_to_be_used_by_calendar_plugin/]] +[[todo/Set_arbitrary_date_to_be_used_by_calendar_plugin]] I had a quick go at doing something similar on Debian Stable (Ikiwiki 3.0) but alas my Ikiwiki fu is not strong enough. From 36518a3a1110eed1d115a798048a9d8bb84b5517 Mon Sep 17 00:00:00 2001 From: "http://joey.kitenet.net/" Date: Tue, 21 Feb 2012 13:23:00 -0400 Subject: [PATCH 062/849] Added a comment --- ...nt_4_4be39c2043821848d4b25d0bf946a718._comment | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 doc/forum/Calendar:_listing_multiple_entries_per_day/comment_4_4be39c2043821848d4b25d0bf946a718._comment diff --git a/doc/forum/Calendar:_listing_multiple_entries_per_day/comment_4_4be39c2043821848d4b25d0bf946a718._comment b/doc/forum/Calendar:_listing_multiple_entries_per_day/comment_4_4be39c2043821848d4b25d0bf946a718._comment new file mode 100644 index 000000000..a71276d6b --- /dev/null +++ b/doc/forum/Calendar:_listing_multiple_entries_per_day/comment_4_4be39c2043821848d4b25d0bf946a718._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2012-02-21T17:23:00Z" + content=""" +To be clear, this patch creates a `yyyy/mm/dd` file for each day, listing the posts for that day, so the calendar can link to it rather than a random single post. + +While a valid solution certainly, that's a lot of added pages! Especially a high overhead for such a minor UI point as this. + +Surely something interesting could be done with javascript or some other form of UI to make clicking on a day in a calendar that has multiple posts present a list of them? That would have essentially no overhead, since the calendar plugin already has a list of the posts made on a given day. + +Ikiwiki already does something similar to deal with the case where a page has a great many backlinks.. It makes a UI element that, if hovered over, pops up a display of all the rest. This is done quite simply in the `page.tmpl` +using the popup and balloon CSS classes. Calendar could also use this. +"""]] From 0c2841349b083b5bf549c2d1f1b44514a79b5a38 Mon Sep 17 00:00:00 2001 From: Amitai Schlair Date: Fri, 3 Feb 2012 11:50:45 -0500 Subject: [PATCH 063/849] Avoid a GNUism in find(1). (cherry picked from commit 9659272e25fac37f896991dab01a05b4f4c85ccb) --- Makefile.PL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.PL b/Makefile.PL index 69ba5e5ef..ef29a950c 100755 --- a/Makefile.PL +++ b/Makefile.PL @@ -75,7 +75,7 @@ underlay_install: install -d $(DESTDIR)$(PREFIX)/share/ikiwiki for dir in `cd underlays && $(FIND) . -follow -type d`; do \ install -d $(DESTDIR)$(PREFIX)/share/ikiwiki/$$dir; \ - for file in `$(FIND) underlays/$$dir -follow -maxdepth 1 -type f -not -name \\*.full.js -not -name \\*.full.css`; do \ + for file in `$(FIND) underlays/$$dir -follow -maxdepth 1 -type f ! -name \\*.full.js ! -name \\*.full.css`; do \ cp -pRL $$file $(DESTDIR)$(PREFIX)/share/ikiwiki/$$dir 2>/dev/null || \ install -m 644 $$file $(DESTDIR)$(PREFIX)/share/ikiwiki/$$dir; \ done; \ From 1ac2da7ffa702f96b406687c463940f599748659 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 21 Feb 2012 13:32:15 -0400 Subject: [PATCH 064/849] fix picked --- doc/bugs/find_gnuism.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/bugs/find_gnuism.mdwn b/doc/bugs/find_gnuism.mdwn index 89eee7816..65ee10657 100644 --- a/doc/bugs/find_gnuism.mdwn +++ b/doc/bugs/find_gnuism.mdwn @@ -3,3 +3,5 @@ Whoops, somehow missed a spot on the last incarnation of this branch. `find -not` doesn't work on NetBSD and `find !` runs equivalently for me. Fixed in 9659272e25fac37f896991dab01a05b4f4c85ccb. + +> [[done]] --[[Joey]] From 2805999a031556602d3fcf8cf38426b613c36842 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY" Date: Wed, 22 Feb 2012 16:13:55 -0400 Subject: [PATCH 065/849] --- ...to_add_a_mouse-over_pop-up_label_for_a_text__63__.mdwn | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/How_to_add_a_mouse-over_pop-up_label_for_a_text__63__.mdwn diff --git a/doc/forum/How_to_add_a_mouse-over_pop-up_label_for_a_text__63__.mdwn b/doc/forum/How_to_add_a_mouse-over_pop-up_label_for_a_text__63__.mdwn new file mode 100644 index 000000000..cf9245404 --- /dev/null +++ b/doc/forum/How_to_add_a_mouse-over_pop-up_label_for_a_text__63__.mdwn @@ -0,0 +1,8 @@ +How to add a mouse-over pop-up label for a text? + +I'd like to have the following effect: + +when a user move the mouse arrow on top of the text, a small window will show up at the upper right of the text and the window contains some additional information about the text. + +Any idea how to achieve this? + From 64825362ad925990b979cb2813539cca9fb8eb70 Mon Sep 17 00:00:00 2001 From: bob Date: Thu, 23 Feb 2012 08:26:13 -0400 Subject: [PATCH 066/849] just for Sally --- doc/sandbox.mdwn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index 47785d0bf..9e4994415 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -11,6 +11,7 @@ This is my custom sidebar for this page. [[!sidebar ]] + ## number 2 ### number 3 @@ -19,6 +20,8 @@ This is the [[SandBox]], a page anyone can edit to try out ikiwiki [[!toc levels=1 startlevel=2 ]] +See, online editing :-p + Let's try this~! w00t, how does this look on the **git** end? Well, as a commit of course. From 7f2e2069a9796d4eed7d0196604e623ac4fa0cc8 Mon Sep 17 00:00:00 2001 From: bob Date: Thu, 23 Feb 2012 13:31:10 -0400 Subject: [PATCH 067/849] I'm sure I'm missing something obvious... --- doc/forum/links_to_diff_on_recentchanges__63__.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/forum/links_to_diff_on_recentchanges__63__.mdwn diff --git a/doc/forum/links_to_diff_on_recentchanges__63__.mdwn b/doc/forum/links_to_diff_on_recentchanges__63__.mdwn new file mode 100644 index 000000000..9a8db62b9 --- /dev/null +++ b/doc/forum/links_to_diff_on_recentchanges__63__.mdwn @@ -0,0 +1 @@ +How can I get the little glasses-icon with a link to the diff on Recentchanges, please? I have git integration working nicely, and recentchangesdiff is producing diffs in the RSS feed, but I'd really like a link on the RecentChanges like you have here. From f85b348070d309f40c2f94aae75e4a374c8affb4 Mon Sep 17 00:00:00 2001 From: "http://joey.kitenet.net/" Date: Thu, 23 Feb 2012 16:20:18 -0400 Subject: [PATCH 068/849] Added a comment --- .../comment_1_1dbc723cc2794f6d45de9cbd2fc2e0fd._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/links_to_diff_on_recentchanges__63__/comment_1_1dbc723cc2794f6d45de9cbd2fc2e0fd._comment diff --git a/doc/forum/links_to_diff_on_recentchanges__63__/comment_1_1dbc723cc2794f6d45de9cbd2fc2e0fd._comment b/doc/forum/links_to_diff_on_recentchanges__63__/comment_1_1dbc723cc2794f6d45de9cbd2fc2e0fd._comment new file mode 100644 index 000000000..a09b410b3 --- /dev/null +++ b/doc/forum/links_to_diff_on_recentchanges__63__/comment_1_1dbc723cc2794f6d45de9cbd2fc2e0fd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-02-23T20:20:17Z" + content=""" +Set up gitweb and configure the `diffurl` in ikiwiki and the glasses will appear. +"""]] From e71642090ca335ae39aa797b9502cf960757e5bb Mon Sep 17 00:00:00 2001 From: bob Date: Fri, 24 Feb 2012 05:30:51 -0400 Subject: [PATCH 069/849] Added a comment --- ...comment_2_4349c85d92cf9c1acf2e7678371ab12a._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/forum/links_to_diff_on_recentchanges__63__/comment_2_4349c85d92cf9c1acf2e7678371ab12a._comment diff --git a/doc/forum/links_to_diff_on_recentchanges__63__/comment_2_4349c85d92cf9c1acf2e7678371ab12a._comment b/doc/forum/links_to_diff_on_recentchanges__63__/comment_2_4349c85d92cf9c1acf2e7678371ab12a._comment new file mode 100644 index 000000000..b98172bfd --- /dev/null +++ b/doc/forum/links_to_diff_on_recentchanges__63__/comment_2_4349c85d92cf9c1acf2e7678371ab12a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="bob" + ip="137.205.152.60" + subject="comment 2" + date="2012-02-24T09:30:50Z" + content=""" +Thanks, that was just the ticket :). My ikiwiki.setup file didn't even have a commented out diffurl in it - is there a handy list of configuration-variables somewhere? I thought the theory was that ikiwiki.setup was generated with (commented out) nearly all the config variables already mentioned? + +[FWIW, I'm using the version in Debian stable] +"""]] From 0f9cbf3ab2db47a6c3d664059d676f9c200144a4 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 25 Feb 2012 15:48:06 -0400 Subject: [PATCH 070/849] create a theme market --- doc/theme_market.mdwn | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/theme_market.mdwn diff --git a/doc/theme_market.mdwn b/doc/theme_market.mdwn new file mode 100644 index 000000000..06526df1a --- /dev/null +++ b/doc/theme_market.mdwn @@ -0,0 +1,11 @@ +[[!meta title="Theme Market" description="user-contributed themes for ikiwiki"]] + +This is a directory of user-contributed ikiwiki themes. For more information about themes, see the [[plugins/theme]] page. + +It is usually preferable (and more maintainable) to create a [[css]] file instead of a full theme, but sometimes the HTML produced by ikiwiki just isn't compatible with your template, so you need to modify the templates provided. This is when you need to make your own theme. + +Feel free to add your own [[theme|themes]] here, but first consider writing a simpler [[css]] file and adding it to the [[css market]] instead, or look at the [[themes]] shipped with ikiwiki. + + * **[[AntPortal theme|https://github.com/AntPortal/ikiwiked]]**, contributed by Danny, see an example [[on the Antportal wiki|https://antportal.com/wiki/]] + + * **[[Night city theme|http://anarcat.ath.cx/night_city/README/]]**, contributed by [[anarcat]], see an example [[on his homepage|http://anarcat.ath.cx/]] From e2c3579399371169b2a2635c59d3b975d80881de Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 25 Feb 2012 15:48:46 -0400 Subject: [PATCH 071/849] link to the themes page --- doc/plugins/theme.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/plugins/theme.mdwn b/doc/plugins/theme.mdwn index d2c62062b..d74784ac2 100644 --- a/doc/plugins/theme.mdwn +++ b/doc/plugins/theme.mdwn @@ -5,7 +5,7 @@ The theme plugin allows easily applying a theme to your wiki, by configuring the `theme` setting in the setup file with the name of a theme to use. The themes you can choose from are all subdirectories, typically inside `/usr/share/ikiwiki/themes/`. See [[themes]] for an overview -of the themes included in ikiwiki. +of the themes included in ikiwiki and the [[theme market]] for third party themes. You can set the theme via the **theme** option in your config file (after enabling the plugin). Refresh the wiki after changing it to see the changes. From c9b1291873c55a4c9f2d2271d0c6d6536fb611fe Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 25 Feb 2012 15:49:17 -0400 Subject: [PATCH 072/849] --- doc/themes/discussion.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/themes/discussion.mdwn b/doc/themes/discussion.mdwn index f2fc8cadf..ce79d0f70 100644 --- a/doc/themes/discussion.mdwn +++ b/doc/themes/discussion.mdwn @@ -5,3 +5,5 @@ I would like to contribute a theme I created and posted on github: For an example of the theme in action, see: [[https://antportal.com/wiki/]] > Shouldn't we just make people post their themes in the [[themes]] page? Or maybe we should make a [[theme market]]? --[[anarcat]] + +> I did just that. -- [[anarcat]] From 73d99ca8baa294cca23c523dc11b1a5bc1e1ecf1 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawnaBKb8zkjbtMU-_PzG2athmhqaHNsutLU" Date: Sun, 26 Feb 2012 01:33:05 -0400 Subject: [PATCH 073/849] testing --- doc/sandbox.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index 9e4994415..d6e44cbe2 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -184,3 +184,5 @@ endmodule This is simple enough for now [[sandbocen]] no? Do code tags work? + +test by max From 04087213c7ae4436b663a99af7406e965d4b1059 Mon Sep 17 00:00:00 2001 From: "http://acathur.myopenid.com/" Date: Sun, 26 Feb 2012 04:08:15 -0400 Subject: [PATCH 074/849] Added a comment --- .../comment_1_ad000d39fd1dc05aa8ef6eb19d8d999b._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/How_to_format___91____91__foobar__93____93___in_code_blocks__63__/comment_1_ad000d39fd1dc05aa8ef6eb19d8d999b._comment diff --git a/doc/forum/How_to_format___91____91__foobar__93____93___in_code_blocks__63__/comment_1_ad000d39fd1dc05aa8ef6eb19d8d999b._comment b/doc/forum/How_to_format___91____91__foobar__93____93___in_code_blocks__63__/comment_1_ad000d39fd1dc05aa8ef6eb19d8d999b._comment new file mode 100644 index 000000000..aa26b086b --- /dev/null +++ b/doc/forum/How_to_format___91____91__foobar__93____93___in_code_blocks__63__/comment_1_ad000d39fd1dc05aa8ef6eb19d8d999b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://acathur.myopenid.com/" + ip="31.56.6.65" + subject="comment 1" + date="2012-02-26T08:08:15Z" + content=""" +doing `\\[[foobar]]` works for me +"""]] From d770218f3a3b617ae54f4335f47317a982a016ee Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY" Date: Mon, 27 Feb 2012 22:27:01 -0400 Subject: [PATCH 075/849] --- .../How_to_show_recent_changes_for_individual_pages__63__.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/forum/How_to_show_recent_changes_for_individual_pages__63__.mdwn diff --git a/doc/forum/How_to_show_recent_changes_for_individual_pages__63__.mdwn b/doc/forum/How_to_show_recent_changes_for_individual_pages__63__.mdwn new file mode 100644 index 000000000..890f24a33 --- /dev/null +++ b/doc/forum/How_to_show_recent_changes_for_individual_pages__63__.mdwn @@ -0,0 +1 @@ +The "RecentChanges" shown under page titles on a individual is linked to the revision history page for the whole site where change to every file in the wiki is listed. Is there a way to get that for individual pages? From 07b87b9512870186cc7a84d406247f88bc1254eb Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlqWSY9PNYRysA9vrU-JiQh7-s7q6SOcIE" Date: Tue, 28 Feb 2012 18:18:45 -0400 Subject: [PATCH 076/849] Create a page --- doc/users/ttw.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/users/ttw.mdwn diff --git a/doc/users/ttw.mdwn b/doc/users/ttw.mdwn new file mode 100644 index 000000000..03caad6c6 --- /dev/null +++ b/doc/users/ttw.mdwn @@ -0,0 +1 @@ +n0gOoi3 From b5bdc362be8f0918b378935f58995ccff7b443c8 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlqWSY9PNYRysA9vrU-JiQh7-s7q6SOcIE" Date: Tue, 28 Feb 2012 18:19:57 -0400 Subject: [PATCH 077/849] Add myself for kicks --- doc/git.mdwn | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/git.mdwn b/doc/git.mdwn index b8bf501c6..36a3d3ad4 100644 --- a/doc/git.mdwn +++ b/doc/git.mdwn @@ -75,6 +75,7 @@ think about merging them. This is recommended. :-) * [[yds]] `git://github.com/yds/ikiwiki.git` * [[pelle]] `git://github.com/hemmop/ikiwiki.git` * [[chrismgray]] `git://github.com/chrismgray/ikiwiki.git` +* [[ttw]] `git://github.com/ttw/ikiwiki.git` ## branches From 19a1bfb7b9dc9a6c574fe4a396436c42477b26b8 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawndsaC4GaIBw49WNdbk2Faqfm_mrtQgul8" Date: Wed, 29 Feb 2012 02:58:26 -0400 Subject: [PATCH 078/849] Added a comment --- .../comment_2_8176ef231cf901802fc60b6d414018e6._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/How_to_change_registration_page/comment_2_8176ef231cf901802fc60b6d414018e6._comment diff --git a/doc/forum/How_to_change_registration_page/comment_2_8176ef231cf901802fc60b6d414018e6._comment b/doc/forum/How_to_change_registration_page/comment_2_8176ef231cf901802fc60b6d414018e6._comment new file mode 100644 index 000000000..8e67162e1 --- /dev/null +++ b/doc/forum/How_to_change_registration_page/comment_2_8176ef231cf901802fc60b6d414018e6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawndsaC4GaIBw49WNdbk2Faqfm_mrtQgul8" + nickname="Christian" + subject="comment 2" + date="2012-02-29T06:58:26Z" + content=""" +thanks! +"""]] From 5df82db1b35559c7f4a660b8afde95bcaf37c2ad Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawndsaC4GaIBw49WNdbk2Faqfm_mrtQgul8" Date: Wed, 29 Feb 2012 02:59:22 -0400 Subject: [PATCH 079/849] Added a comment --- .../comment_4_b0d39d30852bca1525ab9612a7532670._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/OpenID_not_working___47___where_to_define_wiki__39__s_ID__63__/comment_4_b0d39d30852bca1525ab9612a7532670._comment diff --git a/doc/forum/OpenID_not_working___47___where_to_define_wiki__39__s_ID__63__/comment_4_b0d39d30852bca1525ab9612a7532670._comment b/doc/forum/OpenID_not_working___47___where_to_define_wiki__39__s_ID__63__/comment_4_b0d39d30852bca1525ab9612a7532670._comment new file mode 100644 index 000000000..ce3cf2156 --- /dev/null +++ b/doc/forum/OpenID_not_working___47___where_to_define_wiki__39__s_ID__63__/comment_4_b0d39d30852bca1525ab9612a7532670._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawndsaC4GaIBw49WNdbk2Faqfm_mrtQgul8" + nickname="Christian" + subject="comment 4" + date="2012-02-29T06:59:21Z" + content=""" +I had the error with squeeze, too. Have now moved to passwordauth, at least for now... +"""]] From 6f1f7a7cb31f6bee7c5c0f295d0a7db9656a25c5 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawn9r0IXGAV72TXTUjFfsnSspjh_BFtmni0" Date: Wed, 29 Feb 2012 12:23:21 -0400 Subject: [PATCH 080/849] good comment --- doc/sandbox/Nyus_of_se_däi.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/sandbox/Nyus_of_se_däi.mdwn diff --git a/doc/sandbox/Nyus_of_se_däi.mdwn b/doc/sandbox/Nyus_of_se_däi.mdwn new file mode 100644 index 000000000..6205f18bd --- /dev/null +++ b/doc/sandbox/Nyus_of_se_däi.mdwn @@ -0,0 +1 @@ +Sies ahr se nyus of se däi...... säi ahr väri interesting, for schur. From c53aeb3f5cb68c4697ae38d1314d37e57c6240d3 Mon Sep 17 00:00:00 2001 From: jaime Date: Wed, 29 Feb 2012 20:56:30 -0400 Subject: [PATCH 081/849] --- doc/forum/attachments_fail_to_upload.mdwn | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 doc/forum/attachments_fail_to_upload.mdwn diff --git a/doc/forum/attachments_fail_to_upload.mdwn b/doc/forum/attachments_fail_to_upload.mdwn new file mode 100644 index 000000000..afaa4c882 --- /dev/null +++ b/doc/forum/attachments_fail_to_upload.mdwn @@ -0,0 +1,6 @@ +I am having a problem with ikiwiki on an armel processor based machine running 32 bit debian squeeze. +I first installed the ikiwiki deb from the repos and realized there was a problem uploading images. +I downloaded the latest version of ikiwiki from the git repo and made sure I had all of the necessary dependencies and libraries. +Make doesn't seem to complain about anything being missing and make test passes fine. I can create a new wiki and edit pages but anytime I try to upload an image it fails. +I have the attachment plugin activated.And I added mimetype(image/*) and maxsize(5000kb) to the PageSpec field but that made no difference. +I am able to successully add images to the appropriate folders manually via the command line and the commit them to git but I'd liekt o make it work through the web interface. Is there anything that I may have missed? From 10d041438196eda2a3830357004d3c1e6fba6324 Mon Sep 17 00:00:00 2001 From: "http://joey.kitenet.net/" Date: Thu, 1 Mar 2012 12:11:10 -0400 Subject: [PATCH 082/849] Added a comment --- ...comment_1_577adde1dfa49463dfa8e169c462fc42._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/forum/attachments_fail_to_upload/comment_1_577adde1dfa49463dfa8e169c462fc42._comment diff --git a/doc/forum/attachments_fail_to_upload/comment_1_577adde1dfa49463dfa8e169c462fc42._comment b/doc/forum/attachments_fail_to_upload/comment_1_577adde1dfa49463dfa8e169c462fc42._comment new file mode 100644 index 000000000..7d2d66c14 --- /dev/null +++ b/doc/forum/attachments_fail_to_upload/comment_1_577adde1dfa49463dfa8e169c462fc42._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-03-01T16:11:09Z" + content=""" +Saying \"it fails\" is not going to get the best help. If you can look in your web server's error.log file, or get a error message from somewhere else, you might get somewhere. + +You might also check if the machine is running out of memory. It's quite likely that a POSTed attachment is all buffered in the web server's memory before ikiwiki gets ahold of it. +"""]] From d90ccfa8285a65af89c9f4481750c6d7944857e7 Mon Sep 17 00:00:00 2001 From: jaime Date: Thu, 1 Mar 2012 16:08:47 -0400 Subject: [PATCH 083/849] Added a comment --- ...mment_2_473f38c6d523496fac8dad13ac6d20c3._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/forum/attachments_fail_to_upload/comment_2_473f38c6d523496fac8dad13ac6d20c3._comment diff --git a/doc/forum/attachments_fail_to_upload/comment_2_473f38c6d523496fac8dad13ac6d20c3._comment b/doc/forum/attachments_fail_to_upload/comment_2_473f38c6d523496fac8dad13ac6d20c3._comment new file mode 100644 index 000000000..f491a9b71 --- /dev/null +++ b/doc/forum/attachments_fail_to_upload/comment_2_473f38c6d523496fac8dad13ac6d20c3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="jaime" + ip="201.141.41.68" + subject="comment 2" + date="2012-03-01T20:08:47Z" + content=""" +Sorry, \"failed\" is just the message ikwiki's web interface returns. Nginx's error logs don't seem to register anything when the \"failure\" occurs. I am not sure how to properly monitor what is happening with the web server's memory at the time of uploading but just watching htop I can see that the ikiwiki begins to use 100% if the cpu until the process stops but there doesn't seem to be much impact on the overall memory usage, seems to remain about half of available memory. +I'm sorry if that is not helpful. If you can give me some pointers on where to look for more detailed information I can follow instructions. + + + +"""]] From 77945113a77e9413567ef3726b4a45664ef004c7 Mon Sep 17 00:00:00 2001 From: jaime Date: Thu, 1 Mar 2012 18:11:11 -0400 Subject: [PATCH 084/849] --- doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn diff --git a/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn b/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn new file mode 100644 index 000000000..e313a4c39 --- /dev/null +++ b/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn @@ -0,0 +1 @@ +This is very minor. Noticed in nginx's logs that jquery-ui.min.css (the attachment plugin uses this) keeps referencing some png files that are not available in public_html/mywiki/ikiwiki/images/ These should be included in underlays/attachment/ikiwiki/images/ in the source repo and seem to be copied from /usr/local/share/ikiwiki/attachment/ikiwiki/images/ when I compile a new wiki. The complete list of images jquery-ui.min.css is looking for can be found here. https://github.com/jquery/jquery-ui/tree/1.8.14/themes/base/images From 7e0c9ff8437aff3c3d8d519b3367f3c83dd60694 Mon Sep 17 00:00:00 2001 From: jaime Date: Thu, 1 Mar 2012 18:31:30 -0400 Subject: [PATCH 085/849] --- doc/forum/attachments_fail_to_upload.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/forum/attachments_fail_to_upload.mdwn b/doc/forum/attachments_fail_to_upload.mdwn index afaa4c882..62e363a16 100644 --- a/doc/forum/attachments_fail_to_upload.mdwn +++ b/doc/forum/attachments_fail_to_upload.mdwn @@ -4,3 +4,5 @@ I downloaded the latest version of ikiwiki from the git repo and made sure I had Make doesn't seem to complain about anything being missing and make test passes fine. I can create a new wiki and edit pages but anytime I try to upload an image it fails. I have the attachment plugin activated.And I added mimetype(image/*) and maxsize(5000kb) to the PageSpec field but that made no difference. I am able to successully add images to the appropriate folders manually via the command line and the commit them to git but I'd liekt o make it work through the web interface. Is there anything that I may have missed? + +Edit: I just noticed that if I save the page anyway after the the javascript ui reports that the upload has failed, the file has in fact uploaded. From ad5bcc5391f990e7284633f2c9ce3e7b4571004f Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawl7-nncmGyMl7xLqPLGYCD4T1eNeZC23us" Date: Thu, 1 Mar 2012 19:25:31 -0400 Subject: [PATCH 086/849] super test --- doc/sandbox.mdwn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index d6e44cbe2..502bc4fec 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -9,6 +9,9 @@ This is my custom sidebar for this page. \[[!calendar pages="posts/*"]] """]] + +asdfasdf asdfasldkfj asdf + [[!sidebar ]] From 2b92087119dc32712c135ccc22f52e3f8cf2af18 Mon Sep 17 00:00:00 2001 From: fab Date: Fri, 2 Mar 2012 05:07:29 -0400 Subject: [PATCH 087/849] --- doc/ikiwikiusers.mdwn | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn index 4695514d9..8bfc4ccc8 100644 --- a/doc/ikiwikiusers.mdwn +++ b/doc/ikiwikiusers.mdwn @@ -174,3 +174,4 @@ Personal sites and blogs * [Paul Elms](http://paul.elms.pro) Personal site and blog in russian. * [James' Tech Notes](http://jamestechnotes.com) My technical notes, blog, wiki, personal site. * [Salient Dream](http://www.salientdream.com/) - All Things Strange. +* [Kafe-in.net](http://www.kafe-in.net/) Ugly personnal blog. From 25b5ed7e0331318d0aadbd98d6478e242100f07c Mon Sep 17 00:00:00 2001 From: fab Date: Fri, 2 Mar 2012 05:08:00 -0400 Subject: [PATCH 088/849] --- doc/ikiwikiusers.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn index 8bfc4ccc8..b190a6a9e 100644 --- a/doc/ikiwikiusers.mdwn +++ b/doc/ikiwikiusers.mdwn @@ -174,4 +174,4 @@ Personal sites and blogs * [Paul Elms](http://paul.elms.pro) Personal site and blog in russian. * [James' Tech Notes](http://jamestechnotes.com) My technical notes, blog, wiki, personal site. * [Salient Dream](http://www.salientdream.com/) - All Things Strange. -* [Kafe-in.net](http://www.kafe-in.net/) Ugly personnal blog. +* [Kafe-in.net](https://www.kafe-in.net/) Ugly personnal blog. From e41f26e7866681348fc54eb98999e4503b0290ea Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 3 Mar 2012 00:18:07 -0400 Subject: [PATCH 089/849] removed --- doc/plugins/recentchangesdiff/Discussion.mdwn | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 doc/plugins/recentchangesdiff/Discussion.mdwn diff --git a/doc/plugins/recentchangesdiff/Discussion.mdwn b/doc/plugins/recentchangesdiff/Discussion.mdwn deleted file mode 100644 index 55bb542f7..000000000 --- a/doc/plugins/recentchangesdiff/Discussion.mdwn +++ /dev/null @@ -1,20 +0,0 @@ -couldn't the diff be displayed as a popup? right now it's too bad because the diff is actually in the page, generated and downloaded, but the user can't see it. I have tried to address the issue by adding stuff to the change.tmpl template, but I may be missing something - and it doesn't quite look right: - - --- /usr/share/ikiwiki/templates/change.tmpl 2011-09-05 15:14:19.000000000 -0400 - +++ templates/change.tmpl 2011-10-11 13:04:37.704346964 -0400 - @@ -39,6 +39,7 @@ - - - - +[[show diff|wikiicons/diff.png]] -
-
-     
-
-There are a few things wrong with this:
-
- 1. I don't like the hardcoded javascript in there, we should use [[plugins/toggle]] or something, but i am not sure how to make the this plugin depend on toggle, or if it is desirable. 
- 2. it doesn't work at all: first it doesn't actually "toggle" and second the javascript somehow gets filtered out of the resulting HTML so we don't even see it
- 3. if the diffurl parameter is set in the template, we'd actually see two sets of glasses, which is silly. i tried moving the diff button upwards into the PAGES loop, but there the diffurls are file-specific, which also seem quite silly
-
-I am looking for guidance on how to improve and fix this now. --[[anarcat]] 2011-10-11

From eb65410e7520e6d09130a8591d886595219d73e4 Mon Sep 17 00:00:00 2001
From: "https://id.koumbit.net/anarcat" 
Date: Sat, 3 Mar 2012 00:19:17 -0400
Subject: [PATCH 090/849] move plugins/recentchangesdiff/Discussion here

---
 ...provide_inline_diffs_in_recentchanges.mdwn | 23 ++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/doc/todo/provide_inline_diffs_in_recentchanges.mdwn b/doc/todo/provide_inline_diffs_in_recentchanges.mdwn
index 39a35d0c6..fe7eb1014 100644
--- a/doc/todo/provide_inline_diffs_in_recentchanges.mdwn
+++ b/doc/todo/provide_inline_diffs_in_recentchanges.mdwn
@@ -1,8 +1,29 @@
 It would rock if I could view diffs from the web without going via feeds. I envision toggle-style buttons on the recentchanges page, or just links to the CGI, which then displays the diff... --[[madduck]]
 
-> The diffs are actually there, enabled by the `recentchangesdiff`
+> The diffs are actually there, enabled by the [[plugins/recentchangesdiff]]
 > plugin, but they are hidden in the XHTML version by the stylesheet.
 > You might try a user stylesheet with `div.diff { display: block }`.
 > --[[JasonBlevins]]
 
+> > couldn't the diff be displayed as a popup? right now it's too bad because the diff is actually in the page, generated and downloaded, but the user can't see it. I have tried to address the issue by adding stuff to the change.tmpl template, but I may be missing something - and it doesn't quite look right:
+> > 
+> >     --- /usr/share/ikiwiki/templates/change.tmpl    2011-09-05 15:14:19.000000000 -0400
+> >     +++ templates/change.tmpl       2011-10-11 13:04:37.704346964 -0400
+> >     @@ -39,6 +39,7 @@
+> >      
+> >      
+> > +> > +[[show diff|wikiicons/diff.png]] +> >
+> >
+> >      
+> > 
+> > There are a few things wrong with this:
+> > 
+> >  1. I don't like the hardcoded javascript in there, we should use [[plugins/toggle]] or something, but i am not sure how to make the this plugin depend on toggle, or if it is desirable. 
+> >  2. it doesn't work at all: first it doesn't actually "toggle" and second the javascript somehow gets filtered out of the resulting HTML so we don't even see it
+> >  3. if the diffurl parameter is set in the template, we'd actually see two sets of glasses, which is silly. i tried moving the diff button upwards into the PAGES loop, but there the diffurls are file-specific, which also seem quite silly
+> > 
+> > I am looking for guidance on how to improve and fix this now. --[[anarcat]] 2011-10-11
+
 [[!tag wishlist]]

From e6e64bcdaa5e7a9a12f85e1d2a2fe76cb703dc50 Mon Sep 17 00:00:00 2001
From: "https://id.koumbit.net/anarcat" 
Date: Sat, 3 Mar 2012 00:23:08 -0400
Subject: [PATCH 091/849] fixup an implementation of the toggleable diff

---
 ...provide_inline_diffs_in_recentchanges.mdwn | 34 +++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/doc/todo/provide_inline_diffs_in_recentchanges.mdwn b/doc/todo/provide_inline_diffs_in_recentchanges.mdwn
index fe7eb1014..457b7ccb3 100644
--- a/doc/todo/provide_inline_diffs_in_recentchanges.mdwn
+++ b/doc/todo/provide_inline_diffs_in_recentchanges.mdwn
@@ -26,4 +26,38 @@ It would rock if I could view diffs from the web without going via feeds. I envi
 > > 
 > > I am looking for guidance on how to improve and fix this now. --[[anarcat]] 2011-10-11
 
+> > Here is a better implementation:
+> > [[!format txt """
+diff -u change.tmpl.orig change.tmpl
+--- change.tmpl.orig    2012-03-02 23:00:36.706271573 -0500
++++ change.tmpl 2012-03-02 23:15:56.083573086 -0500
+@@ -28,6 +28,9 @@
+ 
+ 
+ ++ ++[[diff|wikiicons/diff.png]] ++ + [[revert|wikiicons/revert.png]] + +
+@@ -39,7 +42,7 @@ + + + +-
++
+
+ 
+ 
+"""]] +> > +> > Unfortunately it has some issues: +> > +> > 1. it assumes the toggle.js code is loaded somehow +> > 2. if the toggle code isn't loaded the diffs are displayed (which is arguably better than showing nothing since we ship the diff to the UA anyways...) +> > 3. it will show only if there's a revert URL, which is backwards, but otherwise the display is weird, with each button on its own line +> > 4. if the diffurl parameter is set in the template, we'd actually see two sets of glasses, which is silly. +> > +> > -- [[anarcat]] 2012-03-11 [[!tag wishlist]] From 8c607e7ffbcc22d3ecc037d5b248deccd6aadb99 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 3 Mar 2012 00:26:24 -0400 Subject: [PATCH 092/849] this is a real patch, tag as such --- doc/todo/provide_inline_diffs_in_recentchanges.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/todo/provide_inline_diffs_in_recentchanges.mdwn b/doc/todo/provide_inline_diffs_in_recentchanges.mdwn index 457b7ccb3..ba320c0af 100644 --- a/doc/todo/provide_inline_diffs_in_recentchanges.mdwn +++ b/doc/todo/provide_inline_diffs_in_recentchanges.mdwn @@ -60,4 +60,4 @@ diff -u change.tmpl.orig change.tmpl > > 4. if the diffurl parameter is set in the template, we'd actually see two sets of glasses, which is silly. > > > > -- [[anarcat]] 2012-03-11 -[[!tag wishlist]] +[[!tag wishlist patch]] From 5494a42d000ee2d09a2086bf21edde52a83b91d0 Mon Sep 17 00:00:00 2001 From: "http://joey.kitenet.net/" Date: Sat, 3 Mar 2012 10:54:11 -0400 Subject: [PATCH 093/849] Added a comment --- ...comment_3_799a2f1b7b259157e97fd31ec76fb845._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/forum/attachments_fail_to_upload/comment_3_799a2f1b7b259157e97fd31ec76fb845._comment diff --git a/doc/forum/attachments_fail_to_upload/comment_3_799a2f1b7b259157e97fd31ec76fb845._comment b/doc/forum/attachments_fail_to_upload/comment_3_799a2f1b7b259157e97fd31ec76fb845._comment new file mode 100644 index 000000000..ebf2756a4 --- /dev/null +++ b/doc/forum/attachments_fail_to_upload/comment_3_799a2f1b7b259157e97fd31ec76fb845._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2012-03-03T14:54:10Z" + content=""" +What version are you running on squeeze? The version shipped with Debian stable does not have the javascript uploader. + +There was a recent problem involving filenames with unicode characters that broke the javascript uploader as you describe, which was fixed in a recent release. +"""]] From a0b64ab6a8b9208ed4901530aeb547158da2d113 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 3 Mar 2012 10:59:02 -0400 Subject: [PATCH 094/849] i hope this is not too much provocative... :) --- doc/wishlist/do_not_make_links_backwards.mdwn | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 doc/wishlist/do_not_make_links_backwards.mdwn diff --git a/doc/wishlist/do_not_make_links_backwards.mdwn b/doc/wishlist/do_not_make_links_backwards.mdwn new file mode 100644 index 000000000..f9c3673d9 --- /dev/null +++ b/doc/wishlist/do_not_make_links_backwards.mdwn @@ -0,0 +1,5 @@ +I understand this may be a bit provocative, but I strongly feel that ikiwiki linking rules are backwards. I come from the world of wikis like MoinMoin and [[plugins/contrib/mediawiki]], where you use `\[[link|description]]`. The defacto wiki markup "[[plugins/creole]]" also uses that convention, as does raw HTML (href comes first!). Ikiwiki doesn't: here we need to use `\[[description|link]]`. + +Everytime i come back to ikiwiki, i need to bend my mind backwards to create *proper* links. I understand that `\[[description|link]]` is more inline with Markdown's `[description](link)` approach, but in my mind it is too much of a problem for third part plugins to be a proper justification. For example, the [[plugins/creole]] plugin works pretty much as expected *expect* for links, because it can't override ikiwiki's internal link parser. For me that's a huge inconsistency that should be fixed. + +If there is an agreement within the community that we can change that, I am ready to work on a migration script or even a configuration variable... -- [[anarcat]] From 3186fcb985e854143c9ef85df8e02e50e19efb1a Mon Sep 17 00:00:00 2001 From: "http://joey.kitenet.net/" Date: Sat, 3 Mar 2012 11:01:34 -0400 Subject: [PATCH 095/849] Added a comment --- ...comment_1_cd34affc6883f4e4bc5e7e7b711cc8ba._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/forum/How_to_show_recent_changes_for_individual_pages__63__/comment_1_cd34affc6883f4e4bc5e7e7b711cc8ba._comment diff --git a/doc/forum/How_to_show_recent_changes_for_individual_pages__63__/comment_1_cd34affc6883f4e4bc5e7e7b711cc8ba._comment b/doc/forum/How_to_show_recent_changes_for_individual_pages__63__/comment_1_cd34affc6883f4e4bc5e7e7b711cc8ba._comment new file mode 100644 index 000000000..8ed341c09 --- /dev/null +++ b/doc/forum/How_to_show_recent_changes_for_individual_pages__63__/comment_1_cd34affc6883f4e4bc5e7e7b711cc8ba._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-03-03T15:01:34Z" + content=""" +The RecentChanges page is a wiki page like any other, containing a special inline directive. You can copy that, and modify the inline's [[ikiwiki/PageSpec]] to match pages changed by a specific author, or with a specific title. + +If you want separate change logs for *every* page, install gitweb and configure historyurl. There will then be a \"History\" link going to the gitweb for each page. +"""]] From fd8bdf406970b0521d6f6ea222411c58850c4e73 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 24 Feb 2012 11:45:33 -0400 Subject: [PATCH 096/849] mention some plugin-specific admin powers --- doc/usage.mdwn | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/usage.mdwn b/doc/usage.mdwn index 44d32a01d..427a51f3b 100644 --- a/doc/usage.mdwn +++ b/doc/usage.mdwn @@ -253,8 +253,10 @@ also be configured using a setup file. Specifies a username of a user (or, if openid is enabled, an openid) who has the powers of a wiki admin. Currently allows locking of any page, - and [[banning|banned_users]] users; other powers may be added later. - May be specified multiple times for multiple admins. + and [[banning|banned_users]] users, as well as powers granted by + enabled plugins (such as [[moderating comments|plugins/moderatedcomments]] + and [[plugins/websetup]]. May be specified multiple times for multiple + admins. For an openid user specify the full URL of the login, including "http://". From 7f755aa51ea0d9faeba3c49d241e4fed12bcba47 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 25 Feb 2012 10:52:11 -0400 Subject: [PATCH 097/849] updated debian copyright format url --- debian/copyright | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/copyright b/debian/copyright index 74418281d..1bcf58e1b 100644 --- a/debian/copyright +++ b/debian/copyright @@ -1,4 +1,4 @@ -Format: http://dep.debian.net/deps/dep5/ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Source: native package Files: * From 5b9005a8dd33feba93d0c85a7fdeaa2194af5d1a Mon Sep 17 00:00:00 2001 From: Paul Wise Date: Tue, 28 Feb 2012 23:14:20 +0800 Subject: [PATCH 098/849] Drop the version attribute on the generator tag in Atom feeds. Removing the version means that rebuilds are reproducible over time. Both the generator tag and its version attribute are optional: http://tools.ietf.org/html/rfc4287#section-4.2.4 --- IkiWiki/Plugin/inline.pm | 1 - templates/atompage.tmpl | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm index 159cc5def..bdab5793b 100644 --- a/IkiWiki/Plugin/inline.pm +++ b/IkiWiki/Plugin/inline.pm @@ -677,7 +677,6 @@ sub genfeed ($$$$$@) { guid => $guid, feeddate => date_3339($lasttime), feedurl => $feedurl, - version => $IkiWiki::version, ); run_hooks(pagetemplate => sub { shift->(page => $page, destpage => $page, diff --git a/templates/atompage.tmpl b/templates/atompage.tmpl index e82b59827..3cdd71d1a 100644 --- a/templates/atompage.tmpl +++ b/templates/atompage.tmpl @@ -33,7 +33,7 @@ -ikiwiki +ikiwiki From 3274b809f2d96bff1e8249047a4a2bedee2c7bf5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 1 Mar 2012 11:50:25 -0400 Subject: [PATCH 099/849] changelog --- debian/changelog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/debian/changelog b/debian/changelog index 2d9ffdb85..0e1749bf9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,8 @@ ikiwiki (3.20120203) UNRELEASED; urgency=low * Fix a snail mail address. Closes: #659158 * openid-jquery.js: Update URL of Wordpress favicon. Closes: #660549 + * Drop the version attribute on the generator tag in Atom feeds + to make builds more reproducible. Closes: #661569 (Paul Wise) -- Joey Hess Wed, 08 Feb 2012 16:07:00 -0400 From 4780c8c5751042e2f202965c19275dae4faa5590 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 2 Mar 2012 01:14:56 -0400 Subject: [PATCH 100/849] update config example for yaml setup file --- doc/plugins/po.mdwn | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index b701d3662..703244947 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -49,15 +49,15 @@ Supported languages `po_master_language` is used to set the "master" language in `ikiwiki.setup`, such as: - po_master_language => 'en|English' + po_master_language: en|English `po_slave_languages` is used to set the list of supported "slave" languages, such as: - po_slave_languages => [ 'fr|Français', - 'es|Español', - 'de|Deutsch', - ] + po_slave_languages: + - fr|Français + - es|Español + - de|Deutsch Decide which pages are translatable ----------------------------------- From 251188cf706f5c9c40e2b4003cd3cd2a777d00ab Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 3 Mar 2012 10:58:58 -0400 Subject: [PATCH 101/849] response --- doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn b/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn index e313a4c39..cdfb860a9 100644 --- a/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn +++ b/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn @@ -1 +1,6 @@ This is very minor. Noticed in nginx's logs that jquery-ui.min.css (the attachment plugin uses this) keeps referencing some png files that are not available in public_html/mywiki/ikiwiki/images/ These should be included in underlays/attachment/ikiwiki/images/ in the source repo and seem to be copied from /usr/local/share/ikiwiki/attachment/ikiwiki/images/ when I compile a new wiki. The complete list of images jquery-ui.min.css is looking for can be found here. https://github.com/jquery/jquery-ui/tree/1.8.14/themes/base/images + +> Do you have a list of files that are *actually* used when ikiwiki is +> running? I don't want to include a lot of files that jquery only +> uses in other situations. The currently included files are exactly those +> that I see it try to use. --[[Joey]] From 78737cbfbf91c7b31ed5d216a23de8d360a76392 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 3 Mar 2012 11:27:59 -0400 Subject: [PATCH 102/849] shortcut: Support Wikipedia's form of url-encoding for unicode characters I think it's the wrong encoding, seems like mojibake to me, but it works now. Closes: #661198 --- IkiWiki/Plugin/shortcut.pm | 18 ++++++++++++++---- debian/changelog | 2 ++ doc/shortcuts.mdwn | 8 +++++--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/IkiWiki/Plugin/shortcut.pm b/IkiWiki/Plugin/shortcut.pm index 0cedbe447..98df143ab 100644 --- a/IkiWiki/Plugin/shortcut.pm +++ b/IkiWiki/Plugin/shortcut.pm @@ -73,11 +73,21 @@ sub shortcut_expand ($$@) { add_depends($params{destpage}, "shortcuts"); my $text=join(" ", @params); - my $encoded_text=$text; - $encoded_text=~s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg; - $url=~s{\%([sS])}{ - $1 eq 's' ? $encoded_text : $text + $url=~s{\%([sSW])}{ + if ($1 eq 's') { + my $t=$text; + $t=~s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg; + $t; + } + elsif ($1 eq 'S') { + $text; + } + elsif ($1 eq 'W') { + my $t=Encode::encode_utf8($text); + $t=~s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg; + $t; + } }eg; $text=~s/_/ /g; diff --git a/debian/changelog b/debian/changelog index 0e1749bf9..bac4874c7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,6 +4,8 @@ ikiwiki (3.20120203) UNRELEASED; urgency=low * openid-jquery.js: Update URL of Wordpress favicon. Closes: #660549 * Drop the version attribute on the generator tag in Atom feeds to make builds more reproducible. Closes: #661569 (Paul Wise) + * shortcut: Support Wikipedia's form of url-encoding for unicode + characters, which involves mojibake. Closes: #661198 -- Joey Hess Wed, 08 Feb 2012 16:07:00 -0400 diff --git a/doc/shortcuts.mdwn b/doc/shortcuts.mdwn index 07210f9bf..722c6b141 100644 --- a/doc/shortcuts.mdwn +++ b/doc/shortcuts.mdwn @@ -15,7 +15,7 @@ This page controls what shortcut links the wiki supports. * [[!shortcut name=archive url="http://web.archive.org/*/%S"]] * [[!shortcut name=gmap url="https://maps.google.com/maps?q=%s"]] * [[!shortcut name=gmsg url="https://groups.google.com/groups?selm=%s"]] -* [[!shortcut name=wikipedia url="https://en.wikipedia.org/wiki/%s"]] +* [[!shortcut name=wikipedia url="https://en.wikipedia.org/wiki/%W"]] * [[!shortcut name=wikitravel url="https://wikitravel.org/en/%s"]] * [[!shortcut name=wiktionary url="https://en.wiktionary.org/wiki/%s"]] * [[!shortcut name=debbug url="http://bugs.debian.org/%S" desc="Debian bug #%s"]] @@ -69,8 +69,10 @@ This page controls what shortcut links the wiki supports. To add a new shortcut, use the `shortcut` [[ikiwiki/directive]]. In the url, "%s" is replaced with the text passed to the named shortcut, after [[!wikipedia url_encoding]] -it, and '%S' is replaced with the raw, non-encoded text. The optional -`desc` parameter controls the description of the link. +it, and '%S' is replaced with the raw, non-encoded text. +Additionally, `%W` is replaced with the text encoded just right for +Wikipedia. The optional `desc` parameter controls the description of +the link. Remember that the `name` you give the shortcut will become a new [[ikiwiki/directive]]. Avoid using a `name` that conflicts From 9f56a417a1c20508f64fd80dc3e8f0eab6ec5f98 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 3 Mar 2012 11:28:40 -0400 Subject: [PATCH 103/849] add osm plugin --- IkiWiki/Plugin/osm.pm | 682 ++++++++++++++++++++++++++++ debian/changelog | 5 + debian/copyright | 4 + doc/ikiwiki/directive/osm.mdwn | 71 +++ doc/ikiwiki/directive/waypoint.mdwn | 6 + doc/plugins/contrib/osm.mdwn | 13 - doc/plugins/osm.mdwn | 29 ++ 7 files changed, 797 insertions(+), 13 deletions(-) create mode 100644 IkiWiki/Plugin/osm.pm create mode 100644 doc/ikiwiki/directive/osm.mdwn create mode 100644 doc/ikiwiki/directive/waypoint.mdwn delete mode 100644 doc/plugins/contrib/osm.mdwn create mode 100644 doc/plugins/osm.mdwn diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm new file mode 100644 index 000000000..09b34850f --- /dev/null +++ b/IkiWiki/Plugin/osm.pm @@ -0,0 +1,682 @@ +#!/usr/bin/perl +# Copyright 2011 Blars Blarson +# Released under GPL version 2 + +package IkiWiki::Plugin::osm; +use utf8; +use strict; +use warnings; +use IkiWiki 3.0; + +sub import { + add_underlay("javascript"); + hook(type => "getsetup", id => "osm", call => \&getsetup); + hook(type => "format", id => "osm", call => \&format); + hook(type => "preprocess", id => "osm", call => \&preprocess); # backward compatibility + hook(type => "preprocess", id => "waypoint", call => \&process_waypoint); + hook(type => "savestate", id => "waypoint", call => \&savestate); + hook(type => "cgi", id => "osm", call => \&cgi); +} + +sub getsetup () { + return + plugin => { + safe => 1, + rebuild => 1, + section => "special-purpose", + }, + osm_default_zoom => { + type => "integer", + example => "15", + description => "the default zoon when you click on the map link", + safe => 1, + rebuild => 1, + }, + osm_default_icon => { + type => "string", + example => "img/osm.png", + description => "the icon showed on links and on the main map", + safe => 0, + rebuild => 1, + }, + osm_alt => { + type => "string", + example => "", + description => "the alt tag of links, defaults to empty", + safe => 0, + rebuild => 1, + }, + osm_format => { + type => "string", + example => "KML", + description => "the output format for waypoints, can be KML, GeoJSON or CSV (one or many, comma-separated)", + safe => 1, + rebuild => 1, + }, + osm_tag_default_icon => { + type => "string", + example => "icon.png", + description => "the icon attached to a tag so that pages tagged with that tag will have that icon on the map", + safe => 0, + rebuild => 1, + }, + osm_tag_icons => { + type => "string", + example => { 'test' => '/img/test.png', + 'trailer' => '/img/trailer.png' ,}, + description => "tag to icon mapping, leading slash is important!", + safe => 0, + rebuild => 1, + }, +} + +sub preprocess { + my %params=@_; + my $page = $params{'page'}; + my $dest = $params{'destpage'}; + my $loc = $params{'loc'}; # sanitized below + my $lat = $params{'lat'}; # sanitized below + my $lon = $params{'lon'}; # sanitized below + my $href = $params{'href'}; + + my $fullscreen = defined($params{'fullscreen'}); # sanitized here + my ($width, $height, $float); + if ($fullscreen) { + $height = '100%'; + $width = '100%'; + $float = 0; + } else { + $height = scrub($params{'height'} || "300px", $page, $dest); # sanitized here + $width = scrub($params{'width'} || "500px", $page, $dest); # sanitized here + $float = (defined($params{'right'}) && 'right') || (defined($params{'left'}) && 'left'); # sanitized here + } + my $zoom = scrub($params{'zoom'} // $config{'osm_default_zoom'} // 15, $page, $dest); # sanitized below + my $map; + if ($fullscreen) { + $map = $params{'map'} || $page; + } else { + $map = $params{'map'} || 'map'; + } + $map = scrub($map, $page, $dest); # sanitized here + my $name = scrub($params{'name'} || $map, $page, $dest); + + if (defined($lon) || defined($lat) || defined($loc)) { + ($lon, $lat) = scrub_lonlat($loc, $lon, $lat); + } + + if ($zoom !~ /^\d\d?$/ || $zoom < 2 || $zoom > 18) { + error("Bad zoom"); + } + $pagestate{$page}{'osm'}{$map}{'displays'}{$name} = + { + 'height' => $height, + 'width' => $width, + 'float' => $float, + 'zoom' => $zoom, + 'fullscreen' => $fullscreen, + 'editable' => defined($params{'editable'}), + 'lat' => $lat, + 'lon' => $lon, + 'href' => $href, + }; + return "
"; +} + +sub process_waypoint { + my %params=@_; + my $loc = $params{'loc'}; # sanitized below + my $lat = $params{'lat'}; # sanitized below + my $lon = $params{'lon'}; # sanitized below + my $page = $params{'page'}; # not sanitized? + my $dest = $params{'destpage'}; # not sanitized? + my $hidden = defined($params{'hidden'}); # sanitized here + my ($p) = $page =~ /(?:^|\/)([^\/]+)\/?$/; # shorter page name + my $name = scrub($params{'name'} || $p, $page, $dest); # sanitized here + my $desc = scrub($params{'desc'} || '', $page, $dest); # sanitized here + my $zoom = scrub($params{'zoom'} // $config{'osm_default_zoom'} // 15, $page, $dest); # sanitized below + my $icon = $config{'osm__default_icon'} || "img/osm.png"; # sanitized: we trust $config + my $map = scrub($params{'map'} || 'map', $page, $dest); # sanitized here + my $alt = $config{'osm_alt'} ? "alt=\"$config{'osm_alt'}\"" : ''; # sanitized: we trust $config + if ($zoom !~ /^\d\d?$/ || $zoom < 2 || $zoom > 18) { + error("Bad zoom"); + } + + ($lon, $lat) = scrub_lonlat($loc, $lon, $lat); + if (!defined($lat) || !defined($lon)) { + error("Must specify lat and lon"); + } + + my $tag = $params{'tag'}; + if ($tag) { + if (!defined($config{'osm_tag_icons'}->{$tag})) { + error("invalid tag specified, see osm_tag_icons configuration or don't specify any"); + } + $icon = $config{'osm_tag_icons'}->{$tag}; + } else { + foreach my $t (keys %{$typedlinks{$page}{'tag'}}) { + if ($icon = get_tag_icon($t)) { + $tag = $t; + last; + } + $t =~ s!/$config{'tagbase'}/!!; + if ($icon = get_tag_icon($t)) { + $tag = $t; + last; + } + } + } + $icon = "/img/unknown.png" unless $icon; + $tag = '' unless $tag; + if ($page eq $dest) { + if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { + $config{'osm_format'} = 'KML'; + } + my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'}); + if ($formats{'GeoJSON'}) { + will_render($page,$config{destdir} . "/$map/pois.json"); + } + if ($formats{'CSV'}) { + will_render($page,$config{destdir} . "/$map/pois.txt"); + } + if ($formats{'KML'}) { + will_render($page,$config{destdir} . "/$map/pois.kml"); + } + + } + my $href = "/ikiwiki.cgi?do=osm&map=$map&lat=$lat&lon=$lon&zoom=$zoom"; + if (defined($destsources{htmlpage($map)})) { + $href = urlto($map,$page) . "?lat=$lat&lon=$lon&zoom=$zoom"; + } + $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = + { + 'page' => $page, + 'desc' => $desc, + 'icon' => $icon, + 'tag' => $tag, + 'lat' => $lat, + 'lon' => $lon, + 'href' => urlto($page,$map), # how to link back to the page from the map, not to be confused with the URL of the map itself sent to the embeded map below + }; + my $output = ''; + if (defined($params{'embed'})) { + $params{'href'} = $href; # propagate down to embeded + $output .= preprocess(%params); + } + if (!$hidden) { + $href =~ s!&!&!g; + $output .= ""; + } + return $output; +} + +# get the icon from the given tag +sub get_tag_icon($) { + my $tag = shift; + # look for an icon attached to the tag + my $attached = $tag . '/' . $config{'osm_tag_default_icon'}; + if (srcfile($attached)) { + return $attached; + } + # look for the old way: mappings + if ($config{'osm_tag_icons'}->{$tag}) { + return $config{'osm_tag_icons'}->{$tag}; + } else { + return undef; + } +} + +sub scrub_lonlat($$$) { + my ($loc, $lon, $lat) = @_; + if($loc) { + if($loc =~ /^\s*(\-?\d+(?:\.\d*°?|(?:°?|\s)\s*\d+(?:\.\d*\'?|(?:\'|\s)\s*\d+(?:\.\d*)?\"?|\'?)°?)[NS]?)\s*\,?\;?\s*(\-?\d+(?:\.\d*°?|(?:°?|\s)\s*\d+(?:\.\d*\'?|(?:\'|\s)\s*\d+(?:\.\d*)?\"?|\'?)°?)[EW]?)\s*$/) { + $lat = $1; + $lon = $2; + } else { + error("Bad loc"); + } + } + if(defined($lat)) { + if($lat =~ /^(\-?)(\d+)(?:(\.\d*)°?|(?:°|\s)\s*(\d+)(?:(\.\d*)\'?|(?:\'|\s)\s*(\d+(?:\.\d*)?\"?)|\'?)|°?)\s*([NS])?\s*$/) { + $lat = $2 + ($3//0) + ((($4//0) + (($5//0) + (($6//0)/60.)))/60.); + if (($1 eq '-') || (($7//'') eq 'S')) { + $lat = - $lat; + } + } else { + error("Bad lat"); + } + } + if(defined($lon)) { + if($lon =~ /^(\-?)(\d+)(?:(\.\d*)°?|(?:°|\s)\s*(\d+)(?:(\.\d*)\'?|(?:\'|\s)\s*(\d+(?:\.\d*)?\"?)|\'?)|°?)\s*([EW])?$/) { + $lon = $2 + ($3//0) + ((($4//0) + (($5//0) + (($6//0)/60.)))/60.); + if (($1 eq '-') || (($7//'') eq 'W')) { + $lon = - $lon; + } + } else { + error("Bad lon"); + } + } + if ($lat < -90 || $lat > 90 || $lon < -180 || $lon > 180) { + error("Location out of range"); + } + return ($lon, $lat); +} + +sub savestate { + my %waypoints = (); + my %linestrings = (); + foreach my $page (keys %pagestate) { + if (exists $pagestate{$page}{'osm'}) { + foreach my $map (keys %{$pagestate{$page}{'osm'}}) { + foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'waypoints'}}) { + debug("found waypoint $name"); + $waypoints{$map}{$name} = $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name}; + } + } + } + } + foreach my $page (keys %pagestate) { + if (exists $pagestate{$page}{'osm'}) { + foreach my $map (keys %{$pagestate{$page}{'osm'}}) { + # examine the links on this page + foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'waypoints'}}) { + if (exists $links{$page}) { + foreach my $otherpage (@{$links{$page}}) { + if (exists $waypoints{$map}{$otherpage}) { + push(@{$linestrings{$map}}, [ [ $waypoints{$map}{$name}{'lon'}, $waypoints{$map}{$name}{'lat'} ], + [ $waypoints{$map}{$otherpage}{'lon'}, $waypoints{$map}{$otherpage}{'lat'} ] ]); + } + } + } + } + } + # clear the state, it will be regenerated on the next parse + # the idea here is to clear up removed waypoints... + $pagestate{$page}{'osm'} = (); + } + } + if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { + $config{'osm_format'} = 'KML'; + } + my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'}); + if ($formats{'GeoJSON'}) { + writejson(\%waypoints, \%linestrings); + } + if ($formats{'CSV'}) { + writecsvs(\%waypoints, \%linestrings); + } + if ($formats{'KML'}) { + writekml(\%waypoints, \%linestrings); + } +} + +sub writejson($;$) { + my %waypoints = %{$_[0]}; + my %linestrings = %{$_[1]}; + eval q{use JSON}; + error $@ if $@; + foreach my $map (keys %waypoints) { + my %geojson = ( "type" => "FeatureCollection", "features" => []); + foreach my $name (keys %{$waypoints{$map}}) { + my %marker = ( "type" => "Feature", + "geometry" => { "type" => "Point", "coordinates" => [ $waypoints{$map}{$name}{'lon'}, $waypoints{$map}{$name}{'lat'} ] }, + "properties" => $waypoints{$map}{$name} ); + push(@{$geojson{'features'}}, \%marker); + } + foreach my $linestring (@{$linestrings{$map}}) { + my %json = ( "type" => "Feature", + "geometry" => { "type" => "LineString", "coordinates" => $linestring }); + push(@{$geojson{'features'}}, \%json); + } + debug('writing pois file pois.json in ' . $config{destdir} . "/$map"); + writefile("pois.json",$config{destdir} . "/$map",to_json(\%geojson)); + } +} + +sub writekml($;$) { + my %waypoints = %{$_[0]}; + my %linestrings = %{$_[1]}; + eval q{use XML::Writer}; + error $@ if $@; + foreach my $map (keys %waypoints) { + debug("writing pois file pois.kml in " . $config{destdir} . "/$map"); + +=pod +Sample placemark: + + + + + Simple placemark + Attached to the ground. Intelligently places itself + at the height of the underlying terrain. + + -122.0822035425683,37.42228990140251,0 + + + + +Sample style: + + + + + +=cut + + use IO::File; + my $output = IO::File->new(">".$config{destdir} . "/$map/pois.kml"); + + my $writer = XML::Writer->new( OUTPUT => $output, DATA_MODE => 1, ENCODING => 'UTF-8'); + $writer->xmlDecl(); + $writer->startTag("kml", "xmlns" => "http://www.opengis.net/kml/2.2"); + + + # first pass: get the icons + foreach my $name (keys %{$waypoints{$map}}) { + my %options = %{$waypoints{$map}{$name}}; + $writer->startTag("Style", id => $options{tag}); + $writer->startTag("IconStyle"); + $writer->startTag("Icon"); + $writer->startTag("href"); + $writer->characters($options{icon}); + $writer->endTag(); + $writer->endTag(); + $writer->endTag(); + $writer->endTag(); + } + + foreach my $name (keys %{$waypoints{$map}}) { + my %options = %{$waypoints{$map}{$name}}; + $writer->startTag("Placemark"); + $writer->startTag("name"); + $writer->characters($name); + $writer->endTag(); + $writer->startTag("styleUrl"); + $writer->characters('#' . $options{tag}); + $writer->endTag(); + #$writer->emptyTag('atom:link', href => $options{href}); + $writer->startTag('href'); # to make it easier for us as the atom:link parameter is hard to access from javascript + $writer->characters($options{href}); + $writer->endTag(); + $writer->startTag("description"); + $writer->characters($options{desc}); + $writer->endTag(); + $writer->startTag("Point"); + $writer->startTag("coordinates"); + $writer->characters($options{lon} . "," . $options{lat}); + $writer->endTag(); + $writer->endTag(); + $writer->endTag(); + } + + my $i = 0; + foreach my $linestring (@{$linestrings{$map}}) { + $writer->startTag("Placemark"); + $writer->startTag("name"); + $writer->characters("linestring " . $i++); + $writer->endTag(); + $writer->startTag("LineString"); + $writer->startTag("coordinates"); + my $str = ''; + foreach my $coord (@{$linestring}) { + $str .= join(',', @{$coord}) . " \n"; + } + $writer->characters($str); + $writer->endTag(); + $writer->endTag(); + $writer->endTag(); + } + $writer->endTag(); + $writer->end(); + $output->close(); + } +} + +sub writecsvs($;$) { + my %waypoints = %{$_[0]}; + foreach my $map (keys %waypoints) { + my $poisf = "lat\tlon\ttitle\tdescription\ticon\ticonSize\ticonOffset\n"; + foreach my $name (keys %{$waypoints{$map}}) { + my %options = %{$waypoints{$map}{$name}}; + my $line = + $options{'lat'} . "\t" . + $options{'lon'} . "\t" . + $name . "\t" . + $options{'desc'} . '
' . $name . "\t" . + $options{'icon'} . "\n"; + $poisf .= $line; + } + debug("writing pois file pois.txt in " . $config{destdir} . "/$map"); + writefile("pois.txt",$config{destdir} . "/$map",$poisf); + } +} + +# pipe some data through the HTML scrubber +# +# code taken from the meta.pm plugin +sub scrub($$$) { + if (IkiWiki::Plugin::htmlscrubber->can("sanitize")) { + return IkiWiki::Plugin::htmlscrubber::sanitize( + content => shift, page => shift, destpage => shift); + } + else { + return shift; + } +} + +# taken from toggle.pm +sub format (@) { + my %params=@_; + + if ($params{content}=~m!]*id="mapdiv-[^"]*"[^>]*>!g) { + if (! ($params{content}=~s!!include_javascript($params{page}).""!em)) { + # no tag, probably in preview mode + $params{content}=$params{content} . include_javascript($params{page}); + } + } + return $params{content}; +} + +sub prefered_format() { + if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { + $config{'osm_format'} = 'KML'; + } + my @spl = split(/, */, $config{'osm_format'}); + return shift @spl; +} + +sub include_javascript ($) { + my $page=shift; + my $loader; + + eval q{use JSON}; + error $@ if $@; + if (exists $pagestate{$page}{'osm'}) { + foreach my $map (keys %{$pagestate{$page}{'osm'}}) { + foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'displays'}}) { + my %options = %{$pagestate{$page}{'osm'}{$map}{'displays'}{$name}}; + $options{'map'} = $map; + $options{'format'} = prefered_format(); + $loader .= "mapsetup(\"mapdiv-$name\", " . to_json(\%options) . ");\n"; + } + } + } + if ($loader) { + return embed_map_code() . ""; + } else { + return ''; + } +} + +sub cgi($) { + my $cgi=shift; + + return unless defined $cgi->param('do') && + $cgi->param("do") eq "osm"; + + IkiWiki::decode_cgi_utf8($cgi); + + my $map = $cgi->param('map'); + if (!defined $map || $map !~ /^[a-z]*$/) { + error("invalid map parameter"); + } + + print "Content-Type: text/html\r\n"; + print ("\r\n"); + print ""; + print "
"; + print embed_map_code($map); + print ""; + print ""; + + exit 0; +} + +sub embed_map_code() { + return < + +EOF +} + +1; diff --git a/debian/changelog b/debian/changelog index bac4874c7..97e51f523 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,11 @@ ikiwiki (3.20120203) UNRELEASED; urgency=low to make builds more reproducible. Closes: #661569 (Paul Wise) * shortcut: Support Wikipedia's form of url-encoding for unicode characters, which involves mojibake. Closes: #661198 + * osm: New plugin to embed an OpenStreetMap into a wiki page. + Supports waypoints, tags, and can even draw paths matching + wikilinks between pages containing waypoints. + Thanks to Blars Blarson and Antoine Beaupré, as well as the worldwide + OpenStreetMap community for this utter awesomeness. -- Joey Hess Wed, 08 Feb 2012 16:07:00 -0400 diff --git a/debian/copyright b/debian/copyright index 1bcf58e1b..8fddb682b 100644 --- a/debian/copyright +++ b/debian/copyright @@ -153,6 +153,10 @@ Files: IkiWiki/Plugin/rsync.pm Copyright: © 2009 Amitai Schlair License: BSD-2-clause +Files: IkiWiki/Plugin/osm.pm +Copyright: © 2011 Blars Blarson, Antoine Beaupré +License: GPL-2 + Files: doc/logo/* Copyright: © 2006 Recai Oktaş License: GPL-2+ diff --git a/doc/ikiwiki/directive/osm.mdwn b/doc/ikiwiki/directive/osm.mdwn new file mode 100644 index 000000000..bf7a2e1bd --- /dev/null +++ b/doc/ikiwiki/directive/osm.mdwn @@ -0,0 +1,71 @@ +The `osm` directive is supplied by the [[!iki plugins/osm desc=osm]] plugin. + +This directive inserts an OpenStreetMap map onto a page. +It is typically combined with the [[waypoint]] directive +to add points to the map. + +## examples + + [[!osm]] + [[!waypoint lat="45°30N" lon="73°40W" name="My city" tag="city"]] + +The osm directive will display the actual map, while the waypoint +directive adds waypoints to the map. + +The above can also be shortened as: + + [[!waypoint lat="45°30N" lon="73°40W" name="My city" tag="city" embed]] + +The tag is also taken from the tags elsewhere in the page, so the +above is equivalent to: + + [[!waypoint lat="45°30N" lon="73°40W" name="My city" embed]] + [[!tag city]] + +The icon is also taken from the tag if attached to the tag page as +icon.png (default, modifiable).. + +## map display + + * `map` - map to display, defaults to the current page + name in fullscreen mode, "map" otherwise + * `zoom` - the level to zoom to on the OSM map + * `loc` - lattitude and longitude of the map center + * `lat` - lattitude + * `lon` - longitude + * `fullscreen` - make the map take the whole screen through CSS + * `editable` - add edit controls in a separate layer + * `right` - float the map right, ignored for fullscreen + * `left` - float the map left (default unless fullscreen) + * `width` - width of the map, ignored for fullscreen + * `height` - height of the map, ignored for fullscreen + +## waypoints + +Waypoints can be added to any page. By default the waypoint takes the +name of the page, which allows you to easily tag pages and make them +appear on the central map. + +Waypoints, by default, show up as a image (the `icon` parameter) link +to the main map (or the `map` parameter provided). That markup can be +hidden with the `hidden` parameter. + + * `name` - the name of this point, defaults to the page name (!) must + be unique, otherwise later incantation will overwrite previous + ones. + * `map` - the map to add the point to (defaults to "map") + * `desc` - description to embed in the map + * `loc` - lattitude and longitude + * `lat` - lattitude + * `lon` - longitude + * `tag` - the type of points, maps to an icon in the osm_types array + * `hidden` - do not display the link to the map (will not affect `embed`) + * `icon` - URL to the icon to show in the link to the map and within + the map + * `embed` - embed the map display alongside the point, in which case + the regular arguments to the map display can be used + +## Links + +If two pages with waypoints have a link between them, that link will +magically show up on the map. Now how awesome is that? diff --git a/doc/ikiwiki/directive/waypoint.mdwn b/doc/ikiwiki/directive/waypoint.mdwn new file mode 100644 index 000000000..e301f8573 --- /dev/null +++ b/doc/ikiwiki/directive/waypoint.mdwn @@ -0,0 +1,6 @@ +The `waypoint` directive is supplied by the [[!iki plugins/osm desc=osm]] plugin. + +This directive adds a waypoint ot an OpenStreetMap map displayed +by the [[osm]] directive. See the [[osm]] directive for examples +and options. + diff --git a/doc/plugins/contrib/osm.mdwn b/doc/plugins/contrib/osm.mdwn deleted file mode 100644 index a4ddbcb37..000000000 --- a/doc/plugins/contrib/osm.mdwn +++ /dev/null @@ -1,13 +0,0 @@ -[[!template id=plugin name=osm author="Blars Blarson, Antoine Beaupré"]] -[[!tag type/special-purpose todo/geotagging]] - -Openstreetmap/Openlayers support for ikiwiki --------------------------------------------- - -This plugin provides simple Openstreetmap/Openlayers support for ikiwiki. It can embed Openstreetmap viewports within a page or link to a bigger map that will have multiple markers, generated with a KML (or CSV, or GeoJSON) datafile of markers based on the different calling pages. Multiple distinct maps on a single wiki are supported. - -Plugin was originally written by [[the techno-viking|http://techno-viking.com/posts/ikiwiki-maps/]] and fixed up by [[anarcat]]. Code is available at `git://src.anarcat.ath.cx/ikiwiki-osm.git`. See [[this page|http://anarcat.ath.cx/software/ikiwiki-osm/README]] for a more complete description and [[the Mtl-mesh wiki|http://mesh.openisp.ca/nodes/anarcat]] for a sample of what this plugin can do. - -See also [[plugins/contrib/googlemaps]]. - -This plugin would be greatly improved by [[todo/internal_definition_list_support]]. diff --git a/doc/plugins/osm.mdwn b/doc/plugins/osm.mdwn new file mode 100644 index 000000000..e41744eb4 --- /dev/null +++ b/doc/plugins/osm.mdwn @@ -0,0 +1,29 @@ +[[!template id=plugin name=osm author="Blars Blarson, Antoine Beaupré"]] +[[!tag type/special-purpose todo/geotagging]] + +## Openstreetmap/Openlayers support for ikiwiki + +This plugin provides simple Openstreetmap/Openlayers support for ikiwiki. +It can embed Openstreetmap viewports within a page or link to a bigger map +that will have multiple markers, generated with a KML (or CSV, or GeoJSON) +datafile of markers based on the different calling pages. Multiple distinct +maps on a single wiki are supported. + +You will need the [[!cpan XML::Writer]] perl module to write KML files, +which is the default mode of operation. GeoJSON files can also be generated +if the [[!cpan JSON]] perl module is installed. + +--- + +The plugin was originally written by +[[the techno-viking|http://techno-viking.com/posts/ikiwiki-maps/]] and fixed up +by [[anarcat]]. + +See [[the Mtl-mesh +wiki|http://mesh.openisp.ca/nodes/anarcat]] for a sample of what this +plugin can do + +See also [[plugins/contrib/googlemaps]]. + +This plugin would be greatly improved by +[[todo/internal_definition_list_support]]. From 8125cfa45b38b653266d03e6106a918f64a7d225 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 3 Mar 2012 12:05:04 -0400 Subject: [PATCH 104/849] reindentation and style no code changes --- IkiWiki/Plugin/osm.pm | 1110 +++++++++++++++++++++-------------------- 1 file changed, 563 insertions(+), 547 deletions(-) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index 09b34850f..e47e83b07 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -9,336 +9,350 @@ use warnings; use IkiWiki 3.0; sub import { - add_underlay("javascript"); - hook(type => "getsetup", id => "osm", call => \&getsetup); - hook(type => "format", id => "osm", call => \&format); - hook(type => "preprocess", id => "osm", call => \&preprocess); # backward compatibility - hook(type => "preprocess", id => "waypoint", call => \&process_waypoint); - hook(type => "savestate", id => "waypoint", call => \&savestate); - hook(type => "cgi", id => "osm", call => \&cgi); + add_underlay("javascript"); + hook(type => "getsetup", id => "osm", call => \&getsetup); + hook(type => "format", id => "osm", call => \&format); + hook(type => "preprocess", id => "osm", call => \&preprocess); + hook(type => "preprocess", id => "waypoint", call => \&process_waypoint); + hook(type => "savestate", id => "waypoint", call => \&savestate); + hook(type => "cgi", id => "osm", call => \&cgi); } sub getsetup () { - return - plugin => { - safe => 1, - rebuild => 1, - section => "special-purpose", - }, - osm_default_zoom => { - type => "integer", - example => "15", - description => "the default zoon when you click on the map link", - safe => 1, - rebuild => 1, - }, - osm_default_icon => { - type => "string", - example => "img/osm.png", - description => "the icon showed on links and on the main map", - safe => 0, - rebuild => 1, - }, - osm_alt => { - type => "string", - example => "", - description => "the alt tag of links, defaults to empty", - safe => 0, - rebuild => 1, - }, - osm_format => { - type => "string", - example => "KML", - description => "the output format for waypoints, can be KML, GeoJSON or CSV (one or many, comma-separated)", - safe => 1, - rebuild => 1, - }, - osm_tag_default_icon => { - type => "string", - example => "icon.png", - description => "the icon attached to a tag so that pages tagged with that tag will have that icon on the map", - safe => 0, - rebuild => 1, - }, - osm_tag_icons => { - type => "string", - example => { 'test' => '/img/test.png', - 'trailer' => '/img/trailer.png' ,}, - description => "tag to icon mapping, leading slash is important!", - safe => 0, - rebuild => 1, - }, + return + plugin => { + safe => 1, + rebuild => 1, + section => "special-purpose", + }, + osm_default_zoom => { + type => "integer", + example => "15", + description => "the default zoom when you click on the map link", + safe => 1, + rebuild => 1, + }, + osm_default_icon => { + type => "string", + example => "img/osm.png", + description => "the icon shon on links and on the main map", + safe => 0, + rebuild => 1, + }, + osm_alt => { + type => "string", + example => "", + description => "the alt tag of links, defaults to empty", + safe => 0, + rebuild => 1, + }, + osm_format => { + type => "string", + example => "KML", + description => "the output format for waypoints, can be KML, GeoJSON or CSV (one or many, comma-separated)", + safe => 1, + rebuild => 1, + }, + osm_tag_default_icon => { + type => "string", + example => "icon.png", + description => "the icon attached to a tag so that pages tagged with that tag will have that icon on the map", + safe => 0, + rebuild => 1, + }, + osm_tag_icons => { + type => "string", + example => { + 'test' => '/img/test.png', + 'trailer' => '/img/trailer.png' + }, + description => "tag to icon mapping, leading slash is important!", + safe => 0, + rebuild => 1, + }, } sub preprocess { - my %params=@_; - my $page = $params{'page'}; - my $dest = $params{'destpage'}; - my $loc = $params{'loc'}; # sanitized below - my $lat = $params{'lat'}; # sanitized below - my $lon = $params{'lon'}; # sanitized below - my $href = $params{'href'}; + my %params=@_; + my $page = $params{'page'}; + my $dest = $params{'destpage'}; + my $loc = $params{'loc'}; # sanitized below + my $lat = $params{'lat'}; # sanitized below + my $lon = $params{'lon'}; # sanitized below + my $href = $params{'href'}; - my $fullscreen = defined($params{'fullscreen'}); # sanitized here - my ($width, $height, $float); - if ($fullscreen) { - $height = '100%'; - $width = '100%'; - $float = 0; - } else { - $height = scrub($params{'height'} || "300px", $page, $dest); # sanitized here - $width = scrub($params{'width'} || "500px", $page, $dest); # sanitized here - $float = (defined($params{'right'}) && 'right') || (defined($params{'left'}) && 'left'); # sanitized here - } - my $zoom = scrub($params{'zoom'} // $config{'osm_default_zoom'} // 15, $page, $dest); # sanitized below - my $map; - if ($fullscreen) { - $map = $params{'map'} || $page; - } else { - $map = $params{'map'} || 'map'; - } - $map = scrub($map, $page, $dest); # sanitized here - my $name = scrub($params{'name'} || $map, $page, $dest); + my $fullscreen = defined($params{'fullscreen'}); # sanitized here + my ($width, $height, $float); + if ($fullscreen) { + $height = '100%'; + $width = '100%'; + $float = 0; + } + else { + $height = scrub($params{'height'} || "300px", $page, $dest); # sanitized here + $width = scrub($params{'width'} || "500px", $page, $dest); # sanitized here + $float = (defined($params{'right'}) && 'right') || (defined($params{'left'}) && 'left'); # sanitized here + } + my $zoom = scrub($params{'zoom'} // $config{'osm_default_zoom'} // 15, $page, $dest); # sanitized below + my $map; + if ($fullscreen) { + $map = $params{'map'} || $page; + } + else { + $map = $params{'map'} || 'map'; + } + $map = scrub($map, $page, $dest); # sanitized here + my $name = scrub($params{'name'} || $map, $page, $dest); - if (defined($lon) || defined($lat) || defined($loc)) { - ($lon, $lat) = scrub_lonlat($loc, $lon, $lat); - } + if (defined($lon) || defined($lat) || defined($loc)) { + ($lon, $lat) = scrub_lonlat($loc, $lon, $lat); + } - if ($zoom !~ /^\d\d?$/ || $zoom < 2 || $zoom > 18) { - error("Bad zoom"); - } - $pagestate{$page}{'osm'}{$map}{'displays'}{$name} = - { - 'height' => $height, - 'width' => $width, - 'float' => $float, - 'zoom' => $zoom, - 'fullscreen' => $fullscreen, - 'editable' => defined($params{'editable'}), - 'lat' => $lat, - 'lon' => $lon, - 'href' => $href, - }; - return "
"; + if ($zoom !~ /^\d\d?$/ || $zoom < 2 || $zoom > 18) { + error("Bad zoom"); + } + $pagestate{$page}{'osm'}{$map}{'displays'}{$name} = { + height => $height, + width => $width, + float => $float, + zoom => $zoom, + fullscreen => $fullscreen, + editable => defined($params{'editable'}), + lat => $lat, + lon => $lon, + href => $href, + }; + return "
"; } sub process_waypoint { - my %params=@_; - my $loc = $params{'loc'}; # sanitized below - my $lat = $params{'lat'}; # sanitized below - my $lon = $params{'lon'}; # sanitized below - my $page = $params{'page'}; # not sanitized? - my $dest = $params{'destpage'}; # not sanitized? - my $hidden = defined($params{'hidden'}); # sanitized here - my ($p) = $page =~ /(?:^|\/)([^\/]+)\/?$/; # shorter page name - my $name = scrub($params{'name'} || $p, $page, $dest); # sanitized here - my $desc = scrub($params{'desc'} || '', $page, $dest); # sanitized here - my $zoom = scrub($params{'zoom'} // $config{'osm_default_zoom'} // 15, $page, $dest); # sanitized below - my $icon = $config{'osm__default_icon'} || "img/osm.png"; # sanitized: we trust $config - my $map = scrub($params{'map'} || 'map', $page, $dest); # sanitized here - my $alt = $config{'osm_alt'} ? "alt=\"$config{'osm_alt'}\"" : ''; # sanitized: we trust $config - if ($zoom !~ /^\d\d?$/ || $zoom < 2 || $zoom > 18) { - error("Bad zoom"); - } + my %params=@_; + my $loc = $params{'loc'}; # sanitized below + my $lat = $params{'lat'}; # sanitized below + my $lon = $params{'lon'}; # sanitized below + my $page = $params{'page'}; # not sanitized? + my $dest = $params{'destpage'}; # not sanitized? + my $hidden = defined($params{'hidden'}); # sanitized here + my ($p) = $page =~ /(?:^|\/)([^\/]+)\/?$/; # shorter page name + my $name = scrub($params{'name'} || $p, $page, $dest); # sanitized here + my $desc = scrub($params{'desc'} || '', $page, $dest); # sanitized here + my $zoom = scrub($params{'zoom'} // $config{'osm_default_zoom'} // 15, $page, $dest); # sanitized below + my $icon = $config{'osm__default_icon'} || "img/osm.png"; # sanitized: we trust $config + my $map = scrub($params{'map'} || 'map', $page, $dest); # sanitized here + my $alt = $config{'osm_alt'} ? "alt=\"$config{'osm_alt'}\"" : ''; # sanitized: we trust $config + if ($zoom !~ /^\d\d?$/ || $zoom < 2 || $zoom > 18) { + error("Bad zoom"); + } - ($lon, $lat) = scrub_lonlat($loc, $lon, $lat); - if (!defined($lat) || !defined($lon)) { - error("Must specify lat and lon"); - } + ($lon, $lat) = scrub_lonlat($loc, $lon, $lat); + if (!defined($lat) || !defined($lon)) { + error("Must specify lat and lon"); + } - my $tag = $params{'tag'}; - if ($tag) { - if (!defined($config{'osm_tag_icons'}->{$tag})) { - error("invalid tag specified, see osm_tag_icons configuration or don't specify any"); - } - $icon = $config{'osm_tag_icons'}->{$tag}; - } else { - foreach my $t (keys %{$typedlinks{$page}{'tag'}}) { - if ($icon = get_tag_icon($t)) { - $tag = $t; - last; - } - $t =~ s!/$config{'tagbase'}/!!; - if ($icon = get_tag_icon($t)) { - $tag = $t; - last; - } - } - } - $icon = "/img/unknown.png" unless $icon; - $tag = '' unless $tag; - if ($page eq $dest) { - if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { - $config{'osm_format'} = 'KML'; - } - my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'}); - if ($formats{'GeoJSON'}) { - will_render($page,$config{destdir} . "/$map/pois.json"); - } - if ($formats{'CSV'}) { - will_render($page,$config{destdir} . "/$map/pois.txt"); - } - if ($formats{'KML'}) { - will_render($page,$config{destdir} . "/$map/pois.kml"); - } - - } - my $href = "/ikiwiki.cgi?do=osm&map=$map&lat=$lat&lon=$lon&zoom=$zoom"; - if (defined($destsources{htmlpage($map)})) { - $href = urlto($map,$page) . "?lat=$lat&lon=$lon&zoom=$zoom"; - } - $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = - { - 'page' => $page, - 'desc' => $desc, - 'icon' => $icon, - 'tag' => $tag, - 'lat' => $lat, - 'lon' => $lon, - 'href' => urlto($page,$map), # how to link back to the page from the map, not to be confused with the URL of the map itself sent to the embeded map below - }; - my $output = ''; - if (defined($params{'embed'})) { - $params{'href'} = $href; # propagate down to embeded - $output .= preprocess(%params); - } - if (!$hidden) { - $href =~ s!&!&!g; - $output .= ""; - } - return $output; + my $tag = $params{'tag'}; + if ($tag) { + if (!defined($config{'osm_tag_icons'}->{$tag})) { + error("invalid tag specified, see osm_tag_icons configuration or don't specify any"); + } + $icon = $config{'osm_tag_icons'}->{$tag}; + } + else { + foreach my $t (keys %{$typedlinks{$page}{'tag'}}) { + if ($icon = get_tag_icon($t)) { + $tag = $t; + last; + } + $t =~ s!/$config{'tagbase'}/!!; + if ($icon = get_tag_icon($t)) { + $tag = $t; + last; + } + } + } + $icon = "/img/unknown.png" unless $icon; + $tag = '' unless $tag; + if ($page eq $dest) { + if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { + $config{'osm_format'} = 'KML'; + } + my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'}); + if ($formats{'GeoJSON'}) { + will_render($page,$config{destdir} . "/$map/pois.json"); + } + if ($formats{'CSV'}) { + will_render($page,$config{destdir} . "/$map/pois.txt"); + } + if ($formats{'KML'}) { + will_render($page,$config{destdir} . "/$map/pois.kml"); + } + } + my $href = "/ikiwiki.cgi?do=osm&map=$map&lat=$lat&lon=$lon&zoom=$zoom"; + if (defined($destsources{htmlpage($map)})) { + $href = urlto($map,$page) . "?lat=$lat&lon=$lon&zoom=$zoom"; + } + $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = { + page => $page, + desc => $desc, + icon => $icon, + tag => $tag, + lat => $lat, + lon => $lon, + # how to link back to the page from the map, not to be + # confused with the URL of the map itself sent to the + # embeded map below + href => urlto($page,$map), + }; + my $output = ''; + if (defined($params{'embed'})) { + $params{'href'} = $href; # propagate down to embeded + $output .= preprocess(%params); + } + if (!$hidden) { + $href =~ s!&!&!g; + $output .= ""; + } + return $output; } # get the icon from the given tag sub get_tag_icon($) { - my $tag = shift; - # look for an icon attached to the tag - my $attached = $tag . '/' . $config{'osm_tag_default_icon'}; - if (srcfile($attached)) { - return $attached; - } - # look for the old way: mappings - if ($config{'osm_tag_icons'}->{$tag}) { - return $config{'osm_tag_icons'}->{$tag}; - } else { - return undef; - } + my $tag = shift; + # look for an icon attached to the tag + my $attached = $tag . '/' . $config{'osm_tag_default_icon'}; + if (srcfile($attached)) { + return $attached; + } + # look for the old way: mappings + if ($config{'osm_tag_icons'}->{$tag}) { + return $config{'osm_tag_icons'}->{$tag}; + } + else { + return undef; + } } sub scrub_lonlat($$$) { - my ($loc, $lon, $lat) = @_; - if($loc) { - if($loc =~ /^\s*(\-?\d+(?:\.\d*°?|(?:°?|\s)\s*\d+(?:\.\d*\'?|(?:\'|\s)\s*\d+(?:\.\d*)?\"?|\'?)°?)[NS]?)\s*\,?\;?\s*(\-?\d+(?:\.\d*°?|(?:°?|\s)\s*\d+(?:\.\d*\'?|(?:\'|\s)\s*\d+(?:\.\d*)?\"?|\'?)°?)[EW]?)\s*$/) { - $lat = $1; - $lon = $2; - } else { - error("Bad loc"); - } - } - if(defined($lat)) { - if($lat =~ /^(\-?)(\d+)(?:(\.\d*)°?|(?:°|\s)\s*(\d+)(?:(\.\d*)\'?|(?:\'|\s)\s*(\d+(?:\.\d*)?\"?)|\'?)|°?)\s*([NS])?\s*$/) { - $lat = $2 + ($3//0) + ((($4//0) + (($5//0) + (($6//0)/60.)))/60.); - if (($1 eq '-') || (($7//'') eq 'S')) { - $lat = - $lat; - } - } else { - error("Bad lat"); - } - } - if(defined($lon)) { - if($lon =~ /^(\-?)(\d+)(?:(\.\d*)°?|(?:°|\s)\s*(\d+)(?:(\.\d*)\'?|(?:\'|\s)\s*(\d+(?:\.\d*)?\"?)|\'?)|°?)\s*([EW])?$/) { - $lon = $2 + ($3//0) + ((($4//0) + (($5//0) + (($6//0)/60.)))/60.); - if (($1 eq '-') || (($7//'') eq 'W')) { - $lon = - $lon; - } - } else { - error("Bad lon"); - } - } - if ($lat < -90 || $lat > 90 || $lon < -180 || $lon > 180) { - error("Location out of range"); - } - return ($lon, $lat); + my ($loc, $lon, $lat) = @_; + if ($loc) { + if ($loc =~ /^\s*(\-?\d+(?:\.\d*°?|(?:°?|\s)\s*\d+(?:\.\d*\'?|(?:\'|\s)\s*\d+(?:\.\d*)?\"?|\'?)°?)[NS]?)\s*\,?\;?\s*(\-?\d+(?:\.\d*°?|(?:°?|\s)\s*\d+(?:\.\d*\'?|(?:\'|\s)\s*\d+(?:\.\d*)?\"?|\'?)°?)[EW]?)\s*$/) { + $lat = $1; + $lon = $2; + } + else { + error("Bad loc"); + } + } + if (defined($lat)) { + if ($lat =~ /^(\-?)(\d+)(?:(\.\d*)°?|(?:°|\s)\s*(\d+)(?:(\.\d*)\'?|(?:\'|\s)\s*(\d+(?:\.\d*)?\"?)|\'?)|°?)\s*([NS])?\s*$/) { + $lat = $2 + ($3//0) + ((($4//0) + (($5//0) + (($6//0)/60.)))/60.); + if (($1 eq '-') || (($7//'') eq 'S')) { + $lat = - $lat; + } + } + else { + error("Bad lat"); + } + } + if (defined($lon)) { + if ($lon =~ /^(\-?)(\d+)(?:(\.\d*)°?|(?:°|\s)\s*(\d+)(?:(\.\d*)\'?|(?:\'|\s)\s*(\d+(?:\.\d*)?\"?)|\'?)|°?)\s*([EW])?$/) { + $lon = $2 + ($3//0) + ((($4//0) + (($5//0) + (($6//0)/60.)))/60.); + if (($1 eq '-') || (($7//'') eq 'W')) { + $lon = - $lon; + } + } + else { + error("Bad lon"); + } + } + if ($lat < -90 || $lat > 90 || $lon < -180 || $lon > 180) { + error("Location out of range"); + } + return ($lon, $lat); } sub savestate { - my %waypoints = (); - my %linestrings = (); - foreach my $page (keys %pagestate) { - if (exists $pagestate{$page}{'osm'}) { - foreach my $map (keys %{$pagestate{$page}{'osm'}}) { - foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'waypoints'}}) { - debug("found waypoint $name"); - $waypoints{$map}{$name} = $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name}; - } - } - } - } - foreach my $page (keys %pagestate) { - if (exists $pagestate{$page}{'osm'}) { - foreach my $map (keys %{$pagestate{$page}{'osm'}}) { - # examine the links on this page - foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'waypoints'}}) { - if (exists $links{$page}) { - foreach my $otherpage (@{$links{$page}}) { - if (exists $waypoints{$map}{$otherpage}) { - push(@{$linestrings{$map}}, [ [ $waypoints{$map}{$name}{'lon'}, $waypoints{$map}{$name}{'lat'} ], - [ $waypoints{$map}{$otherpage}{'lon'}, $waypoints{$map}{$otherpage}{'lat'} ] ]); - } - } - } - } - } - # clear the state, it will be regenerated on the next parse - # the idea here is to clear up removed waypoints... - $pagestate{$page}{'osm'} = (); - } - } - if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { - $config{'osm_format'} = 'KML'; - } - my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'}); - if ($formats{'GeoJSON'}) { - writejson(\%waypoints, \%linestrings); - } - if ($formats{'CSV'}) { - writecsvs(\%waypoints, \%linestrings); - } - if ($formats{'KML'}) { - writekml(\%waypoints, \%linestrings); - } + my %waypoints = (); + my %linestrings = (); + + foreach my $page (keys %pagestate) { + if (exists $pagestate{$page}{'osm'}) { + foreach my $map (keys %{$pagestate{$page}{'osm'}}) { + foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'waypoints'}}) { + debug("found waypoint $name"); + $waypoints{$map}{$name} = $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name}; + } + } + } + } + + foreach my $page (keys %pagestate) { + if (exists $pagestate{$page}{'osm'}) { + foreach my $map (keys %{$pagestate{$page}{'osm'}}) { + # examine the links on this page + foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'waypoints'}}) { + if (exists $links{$page}) { + foreach my $otherpage (@{$links{$page}}) { + if (exists $waypoints{$map}{$otherpage}) { + push(@{$linestrings{$map}}, [ + [ $waypoints{$map}{$name}{'lon'}, $waypoints{$map}{$name}{'lat'} ], + [ $waypoints{$map}{$otherpage}{'lon'}, $waypoints{$map}{$otherpage}{'lat'} ] + ]); + } + } + } + } + } + # clear the state, it will be regenerated on the next parse + # the idea here is to clear up removed waypoints... + $pagestate{$page}{'osm'} = (); + } + } + + if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { + $config{'osm_format'} = 'KML'; + } + my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'}); + if ($formats{'GeoJSON'}) { + writejson(\%waypoints, \%linestrings); + } + if ($formats{'CSV'}) { + writecsvs(\%waypoints, \%linestrings); + } + if ($formats{'KML'}) { + writekml(\%waypoints, \%linestrings); + } } sub writejson($;$) { - my %waypoints = %{$_[0]}; - my %linestrings = %{$_[1]}; - eval q{use JSON}; - error $@ if $@; - foreach my $map (keys %waypoints) { - my %geojson = ( "type" => "FeatureCollection", "features" => []); - foreach my $name (keys %{$waypoints{$map}}) { - my %marker = ( "type" => "Feature", - "geometry" => { "type" => "Point", "coordinates" => [ $waypoints{$map}{$name}{'lon'}, $waypoints{$map}{$name}{'lat'} ] }, - "properties" => $waypoints{$map}{$name} ); - push(@{$geojson{'features'}}, \%marker); - } - foreach my $linestring (@{$linestrings{$map}}) { - my %json = ( "type" => "Feature", - "geometry" => { "type" => "LineString", "coordinates" => $linestring }); - push(@{$geojson{'features'}}, \%json); - } - debug('writing pois file pois.json in ' . $config{destdir} . "/$map"); - writefile("pois.json",$config{destdir} . "/$map",to_json(\%geojson)); - } + my %waypoints = %{$_[0]}; + my %linestrings = %{$_[1]}; + eval q{use JSON}; + error $@ if $@; + foreach my $map (keys %waypoints) { + my %geojson = ( "type" => "FeatureCollection", "features" => []); + foreach my $name (keys %{$waypoints{$map}}) { + my %marker = ( "type" => "Feature", + "geometry" => { "type" => "Point", "coordinates" => [ $waypoints{$map}{$name}{'lon'}, $waypoints{$map}{$name}{'lat'} ] }, + "properties" => $waypoints{$map}{$name} ); + push @{$geojson{'features'}}, \%marker; + } + foreach my $linestring (@{$linestrings{$map}}) { + my %json = ( "type" => "Feature", + "geometry" => { "type" => "LineString", "coordinates" => $linestring }); + push @{$geojson{'features'}}, \%json; + } + debug('writing pois file pois.json in ' . $config{destdir} . "/$map"); + writefile("pois.json",$config{destdir} . "/$map",to_json(\%geojson)); + } } sub writekml($;$) { - my %waypoints = %{$_[0]}; - my %linestrings = %{$_[1]}; - eval q{use XML::Writer}; - error $@ if $@; - foreach my $map (keys %waypoints) { - debug("writing pois file pois.kml in " . $config{destdir} . "/$map"); + my %waypoints = %{$_[0]}; + my %linestrings = %{$_[1]}; + eval q{use XML::Writer}; + error $@ if $@; + foreach my $map (keys %waypoints) { + debug("writing pois file pois.kml in " . $config{destdir} . "/$map"); =pod Sample placemark: @@ -374,92 +388,93 @@ Sample style: =cut - use IO::File; - my $output = IO::File->new(">".$config{destdir} . "/$map/pois.kml"); + use IO::File; + my $output = IO::File->new(">".$config{destdir} . "/$map/pois.kml"); - my $writer = XML::Writer->new( OUTPUT => $output, DATA_MODE => 1, ENCODING => 'UTF-8'); - $writer->xmlDecl(); - $writer->startTag("kml", "xmlns" => "http://www.opengis.net/kml/2.2"); + my $writer = XML::Writer->new( OUTPUT => $output, DATA_MODE => 1, ENCODING => 'UTF-8'); + $writer->xmlDecl(); + $writer->startTag("kml", "xmlns" => "http://www.opengis.net/kml/2.2"); - - # first pass: get the icons - foreach my $name (keys %{$waypoints{$map}}) { - my %options = %{$waypoints{$map}{$name}}; - $writer->startTag("Style", id => $options{tag}); - $writer->startTag("IconStyle"); - $writer->startTag("Icon"); - $writer->startTag("href"); - $writer->characters($options{icon}); - $writer->endTag(); - $writer->endTag(); - $writer->endTag(); - $writer->endTag(); - } - - foreach my $name (keys %{$waypoints{$map}}) { - my %options = %{$waypoints{$map}{$name}}; - $writer->startTag("Placemark"); - $writer->startTag("name"); - $writer->characters($name); - $writer->endTag(); - $writer->startTag("styleUrl"); - $writer->characters('#' . $options{tag}); - $writer->endTag(); - #$writer->emptyTag('atom:link', href => $options{href}); - $writer->startTag('href'); # to make it easier for us as the atom:link parameter is hard to access from javascript - $writer->characters($options{href}); - $writer->endTag(); - $writer->startTag("description"); - $writer->characters($options{desc}); - $writer->endTag(); - $writer->startTag("Point"); - $writer->startTag("coordinates"); - $writer->characters($options{lon} . "," . $options{lat}); - $writer->endTag(); - $writer->endTag(); - $writer->endTag(); - } - - my $i = 0; - foreach my $linestring (@{$linestrings{$map}}) { - $writer->startTag("Placemark"); - $writer->startTag("name"); - $writer->characters("linestring " . $i++); - $writer->endTag(); - $writer->startTag("LineString"); - $writer->startTag("coordinates"); - my $str = ''; - foreach my $coord (@{$linestring}) { - $str .= join(',', @{$coord}) . " \n"; - } - $writer->characters($str); - $writer->endTag(); - $writer->endTag(); - $writer->endTag(); - } - $writer->endTag(); - $writer->end(); - $output->close(); - } + # first pass: get the icons + foreach my $name (keys %{$waypoints{$map}}) { + my %options = %{$waypoints{$map}{$name}}; + $writer->startTag("Style", id => $options{tag}); + $writer->startTag("IconStyle"); + $writer->startTag("Icon"); + $writer->startTag("href"); + $writer->characters($options{icon}); + $writer->endTag(); + $writer->endTag(); + $writer->endTag(); + $writer->endTag(); + } + + foreach my $name (keys %{$waypoints{$map}}) { + my %options = %{$waypoints{$map}{$name}}; + $writer->startTag("Placemark"); + $writer->startTag("name"); + $writer->characters($name); + $writer->endTag(); + $writer->startTag("styleUrl"); + $writer->characters('#' . $options{tag}); + $writer->endTag(); + #$writer->emptyTag('atom:link', href => $options{href}); + # to make it easier for us as the atom:link parameter is + # hard to access from javascript + $writer->startTag('href'); + $writer->characters($options{href}); + $writer->endTag(); + $writer->startTag("description"); + $writer->characters($options{desc}); + $writer->endTag(); + $writer->startTag("Point"); + $writer->startTag("coordinates"); + $writer->characters($options{lon} . "," . $options{lat}); + $writer->endTag(); + $writer->endTag(); + $writer->endTag(); + } + + my $i = 0; + foreach my $linestring (@{$linestrings{$map}}) { + $writer->startTag("Placemark"); + $writer->startTag("name"); + $writer->characters("linestring " . $i++); + $writer->endTag(); + $writer->startTag("LineString"); + $writer->startTag("coordinates"); + my $str = ''; + foreach my $coord (@{$linestring}) { + $str .= join(',', @{$coord}) . " \n"; + } + $writer->characters($str); + $writer->endTag(); + $writer->endTag(); + $writer->endTag(); + } + $writer->endTag(); + $writer->end(); + $output->close(); + } } sub writecsvs($;$) { - my %waypoints = %{$_[0]}; - foreach my $map (keys %waypoints) { - my $poisf = "lat\tlon\ttitle\tdescription\ticon\ticonSize\ticonOffset\n"; - foreach my $name (keys %{$waypoints{$map}}) { - my %options = %{$waypoints{$map}{$name}}; - my $line = - $options{'lat'} . "\t" . - $options{'lon'} . "\t" . - $name . "\t" . - $options{'desc'} . '
' . $name . "\t" . - $options{'icon'} . "\n"; - $poisf .= $line; - } - debug("writing pois file pois.txt in " . $config{destdir} . "/$map"); - writefile("pois.txt",$config{destdir} . "/$map",$poisf); - } + my %waypoints = %{$_[0]}; + foreach my $map (keys %waypoints) { + my $poisf = "lat\tlon\ttitle\tdescription\ticon\ticonSize\ticonOffset\n"; + foreach my $name (keys %{$waypoints{$map}}) { + my %options = %{$waypoints{$map}{$name}}; + my $line = + $options{'lat'} . "\t" . + $options{'lon'} . "\t" . + $name . "\t" . + $options{'desc'} . '
' . $name . "\t" . + $options{'icon'} . "\n"; + $poisf .= $line; + } + debug("writing pois file pois.txt in " . $config{destdir} . "/$map"); + writefile("pois.txt",$config{destdir} . "/$map",$poisf); + } } # pipe some data through the HTML scrubber @@ -477,205 +492,206 @@ sub scrub($$$) { # taken from toggle.pm sub format (@) { - my %params=@_; + my %params=@_; - if ($params{content}=~m!]*id="mapdiv-[^"]*"[^>]*>!g) { - if (! ($params{content}=~s!!include_javascript($params{page}).""!em)) { - # no tag, probably in preview mode - $params{content}=$params{content} . include_javascript($params{page}); - } - } - return $params{content}; + if ($params{content}=~m!]*id="mapdiv-[^"]*"[^>]*>!g) { + if (! ($params{content}=~s!!include_javascript($params{page}).""!em)) { + # no tag, probably in preview mode + $params{content}=$params{content} . include_javascript($params{page}); + } + } + return $params{content}; } sub prefered_format() { - if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { - $config{'osm_format'} = 'KML'; - } - my @spl = split(/, */, $config{'osm_format'}); - return shift @spl; + if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { + $config{'osm_format'} = 'KML'; + } + my @spl = split(/, */, $config{'osm_format'}); + return shift @spl; } sub include_javascript ($) { - my $page=shift; - my $loader; + my $page=shift; + my $loader; - eval q{use JSON}; - error $@ if $@; - if (exists $pagestate{$page}{'osm'}) { - foreach my $map (keys %{$pagestate{$page}{'osm'}}) { - foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'displays'}}) { - my %options = %{$pagestate{$page}{'osm'}{$map}{'displays'}{$name}}; - $options{'map'} = $map; - $options{'format'} = prefered_format(); - $loader .= "mapsetup(\"mapdiv-$name\", " . to_json(\%options) . ");\n"; - } - } - } - if ($loader) { - return embed_map_code() . ""; - } else { - return ''; - } + eval q{use JSON}; + error $@ if $@; + if (exists $pagestate{$page}{'osm'}) { + foreach my $map (keys %{$pagestate{$page}{'osm'}}) { + foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'displays'}}) { + my %options = %{$pagestate{$page}{'osm'}{$map}{'displays'}{$name}}; + $options{'map'} = $map; + $options{'format'} = prefered_format(); + $loader .= "mapsetup(\"mapdiv-$name\", " . to_json(\%options) . ");\n"; + } + } + } + if ($loader) { + return embed_map_code() . ""; + } + else { + return ''; + } } sub cgi($) { - my $cgi=shift; + my $cgi=shift; - return unless defined $cgi->param('do') && - $cgi->param("do") eq "osm"; + return unless defined $cgi->param('do') && + $cgi->param("do") eq "osm"; - IkiWiki::decode_cgi_utf8($cgi); + IkiWiki::decode_cgi_utf8($cgi); - my $map = $cgi->param('map'); - if (!defined $map || $map !~ /^[a-z]*$/) { - error("invalid map parameter"); - } + my $map = $cgi->param('map'); + if (!defined $map || $map !~ /^[a-z]*$/) { + error("invalid map parameter"); + } - print "Content-Type: text/html\r\n"; - print ("\r\n"); - print ""; - print "
"; - print embed_map_code($map); - print ""; - print ""; + print "Content-Type: text/html\r\n"; + print ("\r\n"); + print ""; + print "
"; + print embed_map_code($map); + print ""; + print ""; - exit 0; + exit 0; } sub embed_map_code() { - return < - + + EOF } From 77344163edef5e20f652c82c634e3aeac61d970a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 3 Mar 2012 12:16:00 -0400 Subject: [PATCH 105/849] add osm.png Add an underlay for the osm plugin. Update links to right path to icon. Note that the osm plugin has a pervasive bug in how it links to icons; it assumes the site is at /. I did not attempt to fix that; it should be using urlto() to make a correct relative link. --- IkiWiki/Plugin/osm.pm | 7 ++++--- underlays/osm/ikiwiki/images/osm.png | Bin 0 -> 2982 bytes 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 underlays/osm/ikiwiki/images/osm.png diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index e47e83b07..0fd7ca400 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -10,6 +10,7 @@ use IkiWiki 3.0; sub import { add_underlay("javascript"); + add_underlay("osm"); hook(type => "getsetup", id => "osm", call => \&getsetup); hook(type => "format", id => "osm", call => \&format); hook(type => "preprocess", id => "osm", call => \&preprocess); @@ -34,7 +35,7 @@ sub getsetup () { }, osm_default_icon => { type => "string", - example => "img/osm.png", + example => "/ikiwiki/images/osm.png", description => "the icon shon on links and on the main map", safe => 0, rebuild => 1, @@ -137,7 +138,7 @@ sub process_waypoint { my $name = scrub($params{'name'} || $p, $page, $dest); # sanitized here my $desc = scrub($params{'desc'} || '', $page, $dest); # sanitized here my $zoom = scrub($params{'zoom'} // $config{'osm_default_zoom'} // 15, $page, $dest); # sanitized below - my $icon = $config{'osm__default_icon'} || "img/osm.png"; # sanitized: we trust $config + my $icon = $config{'osm__default_icon'} || "/ikiwiki/images/osm.png"; # sanitized: we trust $config my $map = scrub($params{'map'} || 'map', $page, $dest); # sanitized here my $alt = $config{'osm_alt'} ? "alt=\"$config{'osm_alt'}\"" : ''; # sanitized: we trust $config if ($zoom !~ /^\d\d?$/ || $zoom < 2 || $zoom > 18) { @@ -169,7 +170,7 @@ sub process_waypoint { } } } - $icon = "/img/unknown.png" unless $icon; + $icon = "/ikiwiki/images/osm.png" unless $icon; $tag = '' unless $tag; if ($page eq $dest) { if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { diff --git a/underlays/osm/ikiwiki/images/osm.png b/underlays/osm/ikiwiki/images/osm.png new file mode 100644 index 0000000000000000000000000000000000000000..487bf003c711613b7feb3e495a3279f646ad4ba8 GIT binary patch literal 2982 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 Date: Sat, 3 Mar 2012 12:28:24 -0400 Subject: [PATCH 106/849] add XML::Writer suggestion for osm plugin --- Bundle/IkiWiki/Extras.pm | 1 + debian/control | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Bundle/IkiWiki/Extras.pm b/Bundle/IkiWiki/Extras.pm index d01d52e5b..0a7cd3ae3 100644 --- a/Bundle/IkiWiki/Extras.pm +++ b/Bundle/IkiWiki/Extras.pm @@ -35,6 +35,7 @@ HTML::Tree Sort::Naturally Gravatar::URL Net::INET6Glue +XML::Writer =head1 AUTHOR diff --git a/debian/control b/debian/control index 9403dfb44..54cbd0f7b 100644 --- a/debian/control +++ b/debian/control @@ -38,7 +38,7 @@ Suggests: viewvc | gitweb | viewcvs, libsearch-xapian-perl, libsparkline-php, texlive, dvipng, libtext-wikicreole-perl, libsort-naturally-perl, libtext-textile-perl, libhighlight-perl, po4a (>= 0.35-1), gettext, libnet-inet6glue-perl, - libtext-multimarkdown-perl + libtext-multimarkdown-perl, libxml-writer-perl Conflicts: ikiwiki-plugin-table Replaces: ikiwiki-plugin-table Provides: ikiwiki-plugin-table From e0f42db381dc806318f6bc306d9b6e3c0912a2e9 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 3 Mar 2012 12:33:40 -0400 Subject: [PATCH 107/849] escape example directives --- doc/ikiwiki/directive/osm.mdwn | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/ikiwiki/directive/osm.mdwn b/doc/ikiwiki/directive/osm.mdwn index bf7a2e1bd..a2cdd667f 100644 --- a/doc/ikiwiki/directive/osm.mdwn +++ b/doc/ikiwiki/directive/osm.mdwn @@ -6,21 +6,21 @@ to add points to the map. ## examples - [[!osm]] - [[!waypoint lat="45°30N" lon="73°40W" name="My city" tag="city"]] + \[[!osm]] + \[[!waypoint lat="45°30N" lon="73°40W" name="My city" tag="city"]] The osm directive will display the actual map, while the waypoint directive adds waypoints to the map. The above can also be shortened as: - [[!waypoint lat="45°30N" lon="73°40W" name="My city" tag="city" embed]] + \[[!waypoint lat="45°30N" lon="73°40W" name="My city" tag="city" embed]] The tag is also taken from the tags elsewhere in the page, so the above is equivalent to: - [[!waypoint lat="45°30N" lon="73°40W" name="My city" embed]] - [[!tag city]] + \[[!waypoint lat="45°30N" lon="73°40W" name="My city" embed]] + \[[!tag city]] The icon is also taken from the tag if attached to the tag page as icon.png (default, modifiable).. From 8bc28be4fa0a68e2c6b8831f6d2c0021b96e85f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20Beaupr=C3=A9?= Date: Sat, 3 Mar 2012 15:19:29 -0500 Subject: [PATCH 108/849] split off the javascript in a separate file --- IkiWiki/Plugin/osm.pm | 136 +----------------------- underlays/osm/ikiwiki/javascript/osm.js | 128 ++++++++++++++++++++++ 2 files changed, 131 insertions(+), 133 deletions(-) create mode 100644 underlays/osm/ikiwiki/javascript/osm.js diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index 0fd7ca400..e85d4be62 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -561,139 +561,9 @@ sub cgi($) { } sub embed_map_code() { - return < - -EOF + return ''. + ''."\n"; } 1; diff --git a/underlays/osm/ikiwiki/javascript/osm.js b/underlays/osm/ikiwiki/javascript/osm.js new file mode 100644 index 000000000..7994c62fc --- /dev/null +++ b/underlays/osm/ikiwiki/javascript/osm.js @@ -0,0 +1,128 @@ +// taken from http://stackoverflow.com/questions/901115/get-query-string-values-in-javascript +var urlParams = {}; +(function () { + var e, + a = /\\+/g, // Regex for replacing addition symbol with a space + r = /([^&=]+)=?([^&]*)/g, + d = function (s) { return decodeURIComponent(s.replace(a, " ")); }, + q = window.location.search.substring(1); + + while (e = r.exec(q)) + urlParams[d(e[1])] = d(e[2]); +})(); + +function mapsetup(divname, options) { + div = document.getElementById(divname); + if (options.fullscreen) { + permalink = 'permalink'; + div.style.top = 0; + div.style.left = 0; + div.style.position = 'absolute'; + div.style.width = '100%'; + div.style.height = '100%'; + } + else { + div.style.height = options.height; + div.style.width = options.width; + div.style.float = options.float; + permalink = {base: options.href, title: "View larger map"}; + } + map = new OpenLayers.Map(divname, { + controls: [ + new OpenLayers.Control.Navigation(), + new OpenLayers.Control.ScaleLine(), + new OpenLayers.Control.Permalink(permalink) + ], + displayProjection: new OpenLayers.Projection("EPSG:4326"), + numZoomLevels: 18 + }); + + + map.addLayer(new OpenLayers.Layer.OSM()); + if (options.format == 'CSV') { + pois = new OpenLayers.Layer.Text( "CSV", + { location:"/" + options.map + "/pois.txt", + projection: map.displayProjection + }); + } else if (options.format == 'GeoJSON') { + pois = new OpenLayers.Layer.Vector("GeoJSON", { + protocol: new OpenLayers.Protocol.HTTP({ + url: "/" + options.map + "/pois.json", + format: new OpenLayers.Format.GeoJSON() + }), + strategies: [new OpenLayers.Strategy.Fixed()] + }); + } else { + pois = new OpenLayers.Layer.Vector("KML", { + protocol: new OpenLayers.Protocol.HTTP({ + url: "/" + options.map + "/pois.kml", + format: new OpenLayers.Format.KML({ + extractStyles: true, + extractAttributes: true + }) + }), + strategies: [new OpenLayers.Strategy.Fixed()]}); + } + map.addLayer(pois); + select = new OpenLayers.Control.SelectFeature(pois); + map.addControl(select); + select.activate(); + + pois.events.on({ + "featureselected": function (event) { + var feature = event.feature; + var content = '

' +feature.attributes.name + "

" + feature.attributes.description; + popup = new OpenLayers.Popup.FramedCloud("chicken", + feature.geometry.getBounds().getCenterLonLat(), + new OpenLayers.Size(100,100), + content, + null, true, function () {select.unselectAll()}); + feature.popup = popup; + map.addPopup(popup); + }, + "featureunselected": function (event) { + var feature = event.feature; + if (feature.popup) { + map.removePopup(feature.popup); + feature.popup.destroy(); + delete feature.popup; + } + } + }); + + if (options.editable) { + vlayer = new OpenLayers.Layer.Vector( "Editable" ); + map.addControl(new OpenLayers.Control.EditingToolbar(vlayer)); + map.addLayer(vlayer); + } + + if (options.fullscreen) { + map.addControl(new OpenLayers.Control.PanZoomBar()); + map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false})); + map.addControl(new OpenLayers.Control.MousePosition()); + map.addControl(new OpenLayers.Control.KeyboardDefaults()); + } else { + map.addControl(new OpenLayers.Control.ZoomPanel()); + } + + //Set start centrepoint and zoom + if (!options.lat || !options.lon) { + options.lat = urlParams['lat']; + options.lon = urlParams['lon']; + } + if (!options.zoom) { + options.zoom = urlParams['zoom']; + } + if (options.lat && options.lon) { + var lat = options.lat; + var lon = options.lon; + var zoom= options.zoom || 10; + center = new OpenLayers.LonLat( lon, lat ).transform( + new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984 + map.getProjectionObject() // to Spherical Mercator Projection + ); + map.setCenter (center, zoom); + } else { + pois.events.register("loadend", this, function () { map.zoomToExtent(pois.getDataExtent()); }); + } +} From 733e9b454e6fc016a36874f81392bdf7c2017f9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20Beaupr=C3=A9?= Date: Sat, 3 Mar 2012 15:38:01 -0500 Subject: [PATCH 109/849] properly link to javascript underlay --- IkiWiki/Plugin/osm.pm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index e85d4be62..d8db01dbb 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -529,7 +529,7 @@ sub include_javascript ($) { } } if ($loader) { - return embed_map_code() . ""; + return embed_map_code($page) . ""; } else { return ''; @@ -553,16 +553,17 @@ sub cgi($) { print ("\r\n"); print ""; print "
"; - print embed_map_code($map); + print embed_map_code(); print ""; print ""; exit 0; } -sub embed_map_code() { +sub embed_map_code(;$) { + my $page=shift; return ''. - ''."\n"; } From 0f7c148494a0b35b6949d2cf0a130e38ecfa8ab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20Beaupr=C3=A9?= Date: Sat, 3 Mar 2012 15:54:08 -0500 Subject: [PATCH 110/849] move js in the right location --- underlays/{osm/ikiwiki/javascript => javascript/ikiwiki}/osm.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename underlays/{osm/ikiwiki/javascript => javascript/ikiwiki}/osm.js (100%) diff --git a/underlays/osm/ikiwiki/javascript/osm.js b/underlays/javascript/ikiwiki/osm.js similarity index 100% rename from underlays/osm/ikiwiki/javascript/osm.js rename to underlays/javascript/ikiwiki/osm.js From bdaaa63252e250b8a0d1e54bc4cc4f999ab0bada Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 3 Mar 2012 17:19:54 -0400 Subject: [PATCH 111/849] add my repo here --- doc/git.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/git.mdwn b/doc/git.mdwn index 36a3d3ad4..62c054ab0 100644 --- a/doc/git.mdwn +++ b/doc/git.mdwn @@ -76,8 +76,8 @@ think about merging them. This is recommended. :-) * [[pelle]] `git://github.com/hemmop/ikiwiki.git` * [[chrismgray]] `git://github.com/chrismgray/ikiwiki.git` * [[ttw]] `git://github.com/ttw/ikiwiki.git` +* [[anarcat] `git://src.anarcat.ath.cx/ikiwiki` ## branches Current branches of ikiwiki are listed on [[branches]]. - From f2920a03d8ea4526a43eec920d6153584abe53a5 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 3 Mar 2012 17:20:21 -0400 Subject: [PATCH 112/849] --- doc/git.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/git.mdwn b/doc/git.mdwn index 62c054ab0..1da9fbfbd 100644 --- a/doc/git.mdwn +++ b/doc/git.mdwn @@ -76,7 +76,7 @@ think about merging them. This is recommended. :-) * [[pelle]] `git://github.com/hemmop/ikiwiki.git` * [[chrismgray]] `git://github.com/chrismgray/ikiwiki.git` * [[ttw]] `git://github.com/ttw/ikiwiki.git` -* [[anarcat] `git://src.anarcat.ath.cx/ikiwiki` +* [[anarcat]] `git://src.anarcat.ath.cx/ikiwiki` ## branches From 2e21e45f7d426a954fe150e7335b224822fc6a9c Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 3 Mar 2012 17:25:52 -0400 Subject: [PATCH 113/849] move the patch into my repository --- ...provide_inline_diffs_in_recentchanges.mdwn | 54 +++---------------- 1 file changed, 7 insertions(+), 47 deletions(-) diff --git a/doc/todo/provide_inline_diffs_in_recentchanges.mdwn b/doc/todo/provide_inline_diffs_in_recentchanges.mdwn index ba320c0af..ed9dd85fd 100644 --- a/doc/todo/provide_inline_diffs_in_recentchanges.mdwn +++ b/doc/todo/provide_inline_diffs_in_recentchanges.mdwn @@ -1,3 +1,5 @@ +[[!template id=gitbranch branch=anarcat/inline_diffs author="[[anarcat]]"]] + It would rock if I could view diffs from the web without going via feeds. I envision toggle-style buttons on the recentchanges page, or just links to the CGI, which then displays the diff... --[[madduck]] > The diffs are actually there, enabled by the [[plugins/recentchangesdiff]] @@ -5,52 +7,7 @@ It would rock if I could view diffs from the web without going via feeds. I envi > You might try a user stylesheet with `div.diff { display: block }`. > --[[JasonBlevins]] -> > couldn't the diff be displayed as a popup? right now it's too bad because the diff is actually in the page, generated and downloaded, but the user can't see it. I have tried to address the issue by adding stuff to the change.tmpl template, but I may be missing something - and it doesn't quite look right: -> > -> > --- /usr/share/ikiwiki/templates/change.tmpl 2011-09-05 15:14:19.000000000 -0400 -> > +++ templates/change.tmpl 2011-10-11 13:04:37.704346964 -0400 -> > @@ -39,6 +39,7 @@ -> > -> >
-> > -> > +[[show diff|wikiicons/diff.png]] -> >
-> >
-> >      
-> > 
-> > There are a few things wrong with this:
-> > 
-> >  1. I don't like the hardcoded javascript in there, we should use [[plugins/toggle]] or something, but i am not sure how to make the this plugin depend on toggle, or if it is desirable. 
-> >  2. it doesn't work at all: first it doesn't actually "toggle" and second the javascript somehow gets filtered out of the resulting HTML so we don't even see it
-> >  3. if the diffurl parameter is set in the template, we'd actually see two sets of glasses, which is silly. i tried moving the diff button upwards into the PAGES loop, but there the diffurls are file-specific, which also seem quite silly
-> > 
-> > I am looking for guidance on how to improve and fix this now. --[[anarcat]] 2011-10-11
-
-> > Here is a better implementation:
-> > [[!format txt """
-diff -u change.tmpl.orig change.tmpl
---- change.tmpl.orig    2012-03-02 23:00:36.706271573 -0500
-+++ change.tmpl 2012-03-02 23:15:56.083573086 -0500
-@@ -28,6 +28,9 @@
- 
- 
- -+ -+[[diff|wikiicons/diff.png]] -+ - [[revert|wikiicons/revert.png]] - -
-@@ -39,7 +42,7 @@ - -
- --
-+
-
- 
- 
-"""]] +> > I have implemented this in a branch in my repository (see the side box). > > > > Unfortunately it has some issues: > > @@ -59,5 +16,8 @@ diff -u change.tmpl.orig change.tmpl > > 3. it will show only if there's a revert URL, which is backwards, but otherwise the display is weird, with each button on its own line > > 4. if the diffurl parameter is set in the template, we'd actually see two sets of glasses, which is silly. > > -> > -- [[anarcat]] 2012-03-11 +> > I feel this should nevertheless be implemented because if we're going to compile all this crap in the page anyways and send it to the client, why not allow the user to show it? I also feel that showing it by default is a lesser evil for non-javascript users. +> > +> > -- [[anarcat]] 2012-03-03 + [[!tag wishlist patch]] From dfc8fa9f8e257d103125dd20b15040c584d833f8 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 3 Mar 2012 17:29:31 -0400 Subject: [PATCH 114/849] fix the diff button location --- doc/todo/provide_inline_diffs_in_recentchanges.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/todo/provide_inline_diffs_in_recentchanges.mdwn b/doc/todo/provide_inline_diffs_in_recentchanges.mdwn index ed9dd85fd..7e95791c6 100644 --- a/doc/todo/provide_inline_diffs_in_recentchanges.mdwn +++ b/doc/todo/provide_inline_diffs_in_recentchanges.mdwn @@ -13,7 +13,7 @@ It would rock if I could view diffs from the web without going via feeds. I envi > > > > 1. it assumes the toggle.js code is loaded somehow > > 2. if the toggle code isn't loaded the diffs are displayed (which is arguably better than showing nothing since we ship the diff to the UA anyways...) -> > 3. it will show only if there's a revert URL, which is backwards, but otherwise the display is weird, with each button on its own line +> > 3. it will show only if there's a revert URL, which is backwards, but otherwise the display is weird, with each button on its own line fixed! > > 4. if the diffurl parameter is set in the template, we'd actually see two sets of glasses, which is silly. > > > > I feel this should nevertheless be implemented because if we're going to compile all this crap in the page anyways and send it to the client, why not allow the user to show it? I also feel that showing it by default is a lesser evil for non-javascript users. From e74bb57eea8d69b9fc1d878ade695e759fed4fb5 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 3 Mar 2012 17:33:45 -0400 Subject: [PATCH 115/849] link to the directives --- doc/plugins/osm.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/plugins/osm.mdwn b/doc/plugins/osm.mdwn index e41744eb4..040d175ca 100644 --- a/doc/plugins/osm.mdwn +++ b/doc/plugins/osm.mdwn @@ -13,6 +13,8 @@ You will need the [[!cpan XML::Writer]] perl module to write KML files, which is the default mode of operation. GeoJSON files can also be generated if the [[!cpan JSON]] perl module is installed. +This provides the [[ikiwiki/directive/waypoint]] and [[ikiwiki/directive/osm]] directives. + --- The plugin was originally written by From 2f013cc0c26246d3a29fe6078275b4822b6f4aa9 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 3 Mar 2012 17:39:02 -0400 Subject: [PATCH 116/849] move osm.js to osm underlay and osm does not need javascript underlay --- IkiWiki/Plugin/osm.pm | 1 - underlays/{javascript => osm}/ikiwiki/osm.js | 0 2 files changed, 1 deletion(-) rename underlays/{javascript => osm}/ikiwiki/osm.js (100%) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index d8db01dbb..2b5d0d5f1 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -9,7 +9,6 @@ use warnings; use IkiWiki 3.0; sub import { - add_underlay("javascript"); add_underlay("osm"); hook(type => "getsetup", id => "osm", call => \&getsetup); hook(type => "format", id => "osm", call => \&format); diff --git a/underlays/javascript/ikiwiki/osm.js b/underlays/osm/ikiwiki/osm.js similarity index 100% rename from underlays/javascript/ikiwiki/osm.js rename to underlays/osm/ikiwiki/osm.js From d365187b6206e0c9097da9b893f7fa7ac840c34d Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 3 Mar 2012 17:58:50 -0400 Subject: [PATCH 117/849] add results of my research and a roadmap --- doc/wishlist/do_not_make_links_backwards.mdwn | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/wishlist/do_not_make_links_backwards.mdwn b/doc/wishlist/do_not_make_links_backwards.mdwn index f9c3673d9..c63ed7d55 100644 --- a/doc/wishlist/do_not_make_links_backwards.mdwn +++ b/doc/wishlist/do_not_make_links_backwards.mdwn @@ -3,3 +3,14 @@ I understand this may be a bit provocative, but I strongly feel that ikiwiki lin Everytime i come back to ikiwiki, i need to bend my mind backwards to create *proper* links. I understand that `\[[description|link]]` is more inline with Markdown's `[description](link)` approach, but in my mind it is too much of a problem for third part plugins to be a proper justification. For example, the [[plugins/creole]] plugin works pretty much as expected *expect* for links, because it can't override ikiwiki's internal link parser. For me that's a huge inconsistency that should be fixed. If there is an agreement within the community that we can change that, I am ready to work on a migration script or even a configuration variable... -- [[anarcat]] + +Dev notes +--------- + +I started looking into this, after encouraging words from Joey ("very long term roadmap", AKA "if someone does it"). It turns out it is less deeply rooted than i thought in the core of ikiwiki; everything being a plugin and all, this is also a plugin ([[plugins/link]]). + +The following needs to be done: + + 1. the `link_regexp` variable needs to be turned backwards (or frontwards, if you like :P) + 2. a config setting need to be added to the `link` plugin so that we can choose if we want backwards links or not + 3. a (solid!) parser needs to be written for [[ikiwiki-transition]] to change the actual links (if necessary) From 9b3c09143b04413d2c25d256a8bc9ccdd329f052 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 3 Mar 2012 20:00:01 -0400 Subject: [PATCH 118/849] i have a branch for this and made a lot of progress already, needs testing --- doc/wishlist/do_not_make_links_backwards.mdwn | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/wishlist/do_not_make_links_backwards.mdwn b/doc/wishlist/do_not_make_links_backwards.mdwn index c63ed7d55..5dbcc0a70 100644 --- a/doc/wishlist/do_not_make_links_backwards.mdwn +++ b/doc/wishlist/do_not_make_links_backwards.mdwn @@ -1,3 +1,5 @@ +[[!template id=gitbranch branch=anarcat/backwards_links author="[[anarcat]]"]] + I understand this may be a bit provocative, but I strongly feel that ikiwiki linking rules are backwards. I come from the world of wikis like MoinMoin and [[plugins/contrib/mediawiki]], where you use `\[[link|description]]`. The defacto wiki markup "[[plugins/creole]]" also uses that convention, as does raw HTML (href comes first!). Ikiwiki doesn't: here we need to use `\[[description|link]]`. Everytime i come back to ikiwiki, i need to bend my mind backwards to create *proper* links. I understand that `\[[description|link]]` is more inline with Markdown's `[description](link)` approach, but in my mind it is too much of a problem for third part plugins to be a proper justification. For example, the [[plugins/creole]] plugin works pretty much as expected *expect* for links, because it can't override ikiwiki's internal link parser. For me that's a huge inconsistency that should be fixed. @@ -11,6 +13,7 @@ I started looking into this, after encouraging words from Joey ("very long term The following needs to be done: - 1. the `link_regexp` variable needs to be turned backwards (or frontwards, if you like :P) - 2. a config setting need to be added to the `link` plugin so that we can choose if we want backwards links or not - 3. a (solid!) parser needs to be written for [[ikiwiki-transition]] to change the actual links (if necessary) + 1. the `link_regexp` variable needs to be turned backwards (or frontwards, if you like :P) (./) added an option for this, needs testing + 2. a config setting need to be added to the `link` plugin so that we can choose if we want backwards links or not (./) `backwards_links`, how does that sound? + 3. a (solid!) parser needs to be written for [[ikiwiki-transition]] to change the actual links (if necessary) (!) still todo + 4. rewrite tests to take into account the two syntaxes From f6174572db65168ab00b15162a44163170a28846 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sat, 3 Mar 2012 20:01:01 -0400 Subject: [PATCH 119/849] rename wishlist/do_not_make_links_backwards.mdwn to todo/do_not_make_links_backwards.mdwn --- doc/{wishlist => todo}/do_not_make_links_backwards.mdwn | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/{wishlist => todo}/do_not_make_links_backwards.mdwn (100%) diff --git a/doc/wishlist/do_not_make_links_backwards.mdwn b/doc/todo/do_not_make_links_backwards.mdwn similarity index 100% rename from doc/wishlist/do_not_make_links_backwards.mdwn rename to doc/todo/do_not_make_links_backwards.mdwn From 8c6980e74275a24650519cea0647f1d9dcd7a3eb Mon Sep 17 00:00:00 2001 From: spalax Date: Sat, 3 Mar 2012 20:25:38 -0400 Subject: [PATCH 120/849] --- doc/todo/Javascript_calendar.mdwn | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 doc/todo/Javascript_calendar.mdwn diff --git a/doc/todo/Javascript_calendar.mdwn b/doc/todo/Javascript_calendar.mdwn new file mode 100644 index 000000000..067331aac --- /dev/null +++ b/doc/todo/Javascript_calendar.mdwn @@ -0,0 +1,27 @@ +[[! meta title="Javascript equivalent of plugin 'calendar'"]] +[[!tag patch]] + +Hello, +we ([[Grésille|http://www.gresille.org]]) have a calendar (built using the [[calendar|plugins/calendar]] plugin) in the sidebar of our website. This caused the whole website to be rebuilded each night, and we did not like it. So I wrote a javascript equivalent of the calendar plugin. + +Here are the differences compared to the [[calendar|plugins/calendar]] plugin. + +* Pros + * No need to rebuild the page containing the calendar each time day changes, or + a page (indexed by the calendar) is added, changed or deleted. This is + particularly useful if you want to have this calendar in the sidebar. + * Smooth navigation among months. +* Neutral + * Most of options are defined in Ikiwiki's setup files instead of the options + of the directive. +* Cons + * As a consequence, every calendar of the wiki must index the same set of pages. + * Javascript :( . + +You can see this plugin in action on [[our website|http://www.gresille.org]]. + +I do not know how contributions are processed, but if you want to include this plugin in Ikiwiki, I made a copy of Ikiwiki repository, with this new plugin (as well as the documentation for the plugin and the directive). + + git clone http://spalax.homedns.org/git/ikiwiki + +-- Spalax From 53fe1fa546244b807bbdfff0db2d427031f8e49c Mon Sep 17 00:00:00 2001 From: spalax Date: Sat, 3 Mar 2012 20:26:34 -0400 Subject: [PATCH 121/849] Typo --- doc/todo/Javascript_calendar.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/todo/Javascript_calendar.mdwn b/doc/todo/Javascript_calendar.mdwn index 067331aac..30f47cb35 100644 --- a/doc/todo/Javascript_calendar.mdwn +++ b/doc/todo/Javascript_calendar.mdwn @@ -1,4 +1,4 @@ -[[! meta title="Javascript equivalent of plugin 'calendar'"]] +[[!meta title="Javascript equivalent of plugin 'calendar'"]] [[!tag patch]] Hello, From 93a42f9cace10752a194df721e9cabf537c69bb1 Mon Sep 17 00:00:00 2001 From: spalax Date: Sat, 3 Mar 2012 20:30:00 -0400 Subject: [PATCH 122/849] --- doc/todo/Javascript_calendar.mdwn | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/todo/Javascript_calendar.mdwn b/doc/todo/Javascript_calendar.mdwn index 30f47cb35..1b6eee4cf 100644 --- a/doc/todo/Javascript_calendar.mdwn +++ b/doc/todo/Javascript_calendar.mdwn @@ -10,6 +10,7 @@ Here are the differences compared to the [[calendar|plugins/calendar]] plugin. * No need to rebuild the page containing the calendar each time day changes, or a page (indexed by the calendar) is added, changed or deleted. This is particularly useful if you want to have this calendar in the sidebar. + * Handles the case where several pages appear the same day: a popup appear to let user choose the day he wants. * Smooth navigation among months. * Neutral * Most of options are defined in Ikiwiki's setup files instead of the options @@ -18,7 +19,7 @@ Here are the differences compared to the [[calendar|plugins/calendar]] plugin. * As a consequence, every calendar of the wiki must index the same set of pages. * Javascript :( . -You can see this plugin in action on [[our website|http://www.gresille.org]]. +You can see this plugin in action on [[our website|http://www.gresille.org]]. To see what happens when several pages happens on the same day, check the 15th of March 2012. I do not know how contributions are processed, but if you want to include this plugin in Ikiwiki, I made a copy of Ikiwiki repository, with this new plugin (as well as the documentation for the plugin and the directive). From afa777c11f0aac947fd04cd03190d18a9de32ffb Mon Sep 17 00:00:00 2001 From: "http://acathur.myopenid.com/" Date: Sun, 4 Mar 2012 03:55:39 -0400 Subject: [PATCH 123/849] --- doc/users/acathur.mdwn | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/users/acathur.mdwn diff --git a/doc/users/acathur.mdwn b/doc/users/acathur.mdwn new file mode 100644 index 000000000..fc3768ee1 --- /dev/null +++ b/doc/users/acathur.mdwn @@ -0,0 +1,3 @@ +Today I finally managed to setup and use ikiwiki, the way I intended to, after thinking about it for 3 years or more! +This's to celebrate that, and to hopefuly contributing to ikiwiki in any possible way. + From af8aecf2613bd8fed579800caccb13777c21a96a Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sun, 4 Mar 2012 13:56:01 -0400 Subject: [PATCH 124/849] update progress and outline a critical blocker: the underlay! --- doc/todo/do_not_make_links_backwards.mdwn | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/todo/do_not_make_links_backwards.mdwn b/doc/todo/do_not_make_links_backwards.mdwn index 5dbcc0a70..8725d7feb 100644 --- a/doc/todo/do_not_make_links_backwards.mdwn +++ b/doc/todo/do_not_make_links_backwards.mdwn @@ -13,7 +13,9 @@ I started looking into this, after encouraging words from Joey ("very long term The following needs to be done: - 1. the `link_regexp` variable needs to be turned backwards (or frontwards, if you like :P) (./) added an option for this, needs testing + 1. the `link_regexp` variable needs to be turned backwards (or frontwards, if you like :P) (./) added an option for this, working! 2. a config setting need to be added to the `link` plugin so that we can choose if we want backwards links or not (./) `backwards_links`, how does that sound? - 3. a (solid!) parser needs to be written for [[ikiwiki-transition]] to change the actual links (if necessary) (!) still todo + 3. a (solid!) parser needs to be written for [[ikiwiki-transition]] to change the actual links (if necessary) (!) in progress, almost done 4. rewrite tests to take into account the two syntaxes + +There's a blocker: we can't have a per-wiki backwards_links option, because of the underlay, common to all wikis, which needs to be converted. So the option doesn't make much sense. Not sure how to deal with this... Maybe this needs to be at the package level? From 82124cc8dd3b8dd2d43144795f319bbe2f4506a7 Mon Sep 17 00:00:00 2001 From: "http://k1024.org/~iusty/" Date: Sun, 4 Mar 2012 15:18:16 -0400 Subject: [PATCH 125/849] Add section about comment threads --- doc/plugins/comments/discussion.mdwn | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/plugins/comments/discussion.mdwn b/doc/plugins/comments/discussion.mdwn index 3043b0106..fefdfd5eb 100644 --- a/doc/plugins/comments/discussion.mdwn +++ b/doc/plugins/comments/discussion.mdwn @@ -203,3 +203,16 @@ wake of this: correction follow-ups are common. -- [[Jon]] + + +--- + +## Comment threads + +Any thoughts about implementing some simple threading in the comments? + +Or at least a reply functionality that quotes the subject/contents? + +thanks! iustin + +--- From 625dc0ac649a99bd03fe7b2d859802d6b62e5b93 Mon Sep 17 00:00:00 2001 From: "http://k1024.org/~iusty/" Date: Sun, 4 Mar 2012 15:23:13 -0400 Subject: [PATCH 126/849] Create my user page --- doc/users/iustin.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/users/iustin.mdwn diff --git a/doc/users/iustin.mdwn b/doc/users/iustin.mdwn new file mode 100644 index 000000000..db8cae218 --- /dev/null +++ b/doc/users/iustin.mdwn @@ -0,0 +1 @@ +I use ikiwiki to maintain my [personal blog](http://k1024.org/) and also for some private wikis. From 840e282d1cd523fcf6999ab61f258690f841c2c0 Mon Sep 17 00:00:00 2001 From: "http://k1024.org/~iusty/" Date: Sun, 4 Mar 2012 15:24:16 -0400 Subject: [PATCH 127/849] Replace my signature with user name --- doc/plugins/comments/discussion.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/plugins/comments/discussion.mdwn b/doc/plugins/comments/discussion.mdwn index fefdfd5eb..227890bdd 100644 --- a/doc/plugins/comments/discussion.mdwn +++ b/doc/plugins/comments/discussion.mdwn @@ -213,6 +213,6 @@ Any thoughts about implementing some simple threading in the comments? Or at least a reply functionality that quotes the subject/contents? -thanks! iustin +-- [[iustin]] --- From 318687f84d152d3a52683f09dff17deb08ab6eeb Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sun, 4 Mar 2012 21:37:40 -0400 Subject: [PATCH 128/849] --- doc/todo/do_not_make_links_backwards.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/todo/do_not_make_links_backwards.mdwn b/doc/todo/do_not_make_links_backwards.mdwn index 8725d7feb..a2d1abc49 100644 --- a/doc/todo/do_not_make_links_backwards.mdwn +++ b/doc/todo/do_not_make_links_backwards.mdwn @@ -14,7 +14,7 @@ I started looking into this, after encouraging words from Joey ("very long term The following needs to be done: 1. the `link_regexp` variable needs to be turned backwards (or frontwards, if you like :P) (./) added an option for this, working! - 2. a config setting need to be added to the `link` plugin so that we can choose if we want backwards links or not (./) `backwards_links`, how does that sound? + 2. a config setting need to be added to the `link` plugin so that we can choose if we want backwards links or not (./) `links_direction`, how does that sound? I have changed that from `backwards_links` to be more neutral. 'rtl' means `\[[link|text]]` and 'ltr' means `\[[text|link]]` 3. a (solid!) parser needs to be written for [[ikiwiki-transition]] to change the actual links (if necessary) (!) in progress, almost done 4. rewrite tests to take into account the two syntaxes From 0b15ae0761e68ba5635f90c29b77c3cdbeb43a8f Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sun, 4 Mar 2012 22:04:15 -0400 Subject: [PATCH 129/849] update progress: migration script in place, this is mostly finished, minus some caveats --- doc/todo/do_not_make_links_backwards.mdwn | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/todo/do_not_make_links_backwards.mdwn b/doc/todo/do_not_make_links_backwards.mdwn index a2d1abc49..a8001c400 100644 --- a/doc/todo/do_not_make_links_backwards.mdwn +++ b/doc/todo/do_not_make_links_backwards.mdwn @@ -15,7 +15,7 @@ The following needs to be done: 1. the `link_regexp` variable needs to be turned backwards (or frontwards, if you like :P) (./) added an option for this, working! 2. a config setting need to be added to the `link` plugin so that we can choose if we want backwards links or not (./) `links_direction`, how does that sound? I have changed that from `backwards_links` to be more neutral. 'rtl' means `\[[link|text]]` and 'ltr' means `\[[text|link]]` - 3. a (solid!) parser needs to be written for [[ikiwiki-transition]] to change the actual links (if necessary) (!) in progress, almost done - 4. rewrite tests to take into account the two syntaxes + 3. a (solid!) parser needs to be written for [[ikiwiki-transition]] to change the actual links (if necessary) (./) done! + 4. rewrite tests to take into account the two syntaxes (!) I would need help here, always have trouble with unit tests... -There's a blocker: we can't have a per-wiki backwards_links option, because of the underlay, common to all wikis, which needs to be converted. So the option doesn't make much sense. Not sure how to deal with this... Maybe this needs to be at the package level? + There's a caveat: we can't have a per-wiki backwards_links option, because of the underlay, common to all wikis, which needs to be converted. So the option doesn't make much sense. Not sure how to deal with this... Maybe this needs to be at the package level? From d937d203dc93dbdd5bed529fefa6b115ed1ed6ef Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Sun, 4 Mar 2012 22:07:49 -0400 Subject: [PATCH 130/849] --- doc/todo/do_not_make_links_backwards.mdwn | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/todo/do_not_make_links_backwards.mdwn b/doc/todo/do_not_make_links_backwards.mdwn index a8001c400..d7ce27806 100644 --- a/doc/todo/do_not_make_links_backwards.mdwn +++ b/doc/todo/do_not_make_links_backwards.mdwn @@ -17,5 +17,6 @@ The following needs to be done: 2. a config setting need to be added to the `link` plugin so that we can choose if we want backwards links or not (./) `links_direction`, how does that sound? I have changed that from `backwards_links` to be more neutral. 'rtl' means `\[[link|text]]` and 'ltr' means `\[[text|link]]` 3. a (solid!) parser needs to be written for [[ikiwiki-transition]] to change the actual links (if necessary) (./) done! 4. rewrite tests to take into account the two syntaxes (!) I would need help here, always have trouble with unit tests... + 5. deal with underlays (!!) There's a caveat: we can't have a per-wiki backwards_links option, because of the underlay, common to all wikis, which needs to be converted. So the option doesn't make much sense. Not sure how to deal with this... Maybe this needs to be at the package level? From d3643cd1259682dbe0fc05a81da4e75cd12e6c0e Mon Sep 17 00:00:00 2001 From: "http://smcv.pseudorandom.co.uk/" Date: Mon, 5 Mar 2012 05:12:02 -0400 Subject: [PATCH 131/849] some feedback --- doc/todo/do_not_make_links_backwards.mdwn | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/todo/do_not_make_links_backwards.mdwn b/doc/todo/do_not_make_links_backwards.mdwn index d7ce27806..13770b379 100644 --- a/doc/todo/do_not_make_links_backwards.mdwn +++ b/doc/todo/do_not_make_links_backwards.mdwn @@ -19,4 +19,13 @@ The following needs to be done: 4. rewrite tests to take into account the two syntaxes (!) I would need help here, always have trouble with unit tests... 5. deal with underlays (!!) +> It's not at all obvious to me that `rtl` should mean "link before description" +> and not the other way round. Perhaps `wikilink_text_first` => `1` for the historical +> IkiWiki syntax or `0` for the Creole/Mediawiki syntax? --[[smcv]] + There's a caveat: we can't have a per-wiki backwards_links option, because of the underlay, common to all wikis, which needs to be converted. So the option doesn't make much sense. Not sure how to deal with this... Maybe this needs to be at the package level? + +> I've thought about adding a direction-neutral `\[[!link]]` directive - +> see [[link plugin perhaps too general?]] for details. The basewiki +> could use `\[[!link to=b desc=a]]` whenever it needs `\[[a|b]]`-style +> links, maybe? --[[smcv]] From d84b3fd1e75923918e15967e582f29dbb278d0a0 Mon Sep 17 00:00:00 2001 From: "http://www.tobez.org/" Date: Mon, 5 Mar 2012 12:39:59 -0400 Subject: [PATCH 132/849] --- doc/ikiwikiusers.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn index b190a6a9e..7ede47e99 100644 --- a/doc/ikiwikiusers.mdwn +++ b/doc/ikiwikiusers.mdwn @@ -79,6 +79,7 @@ Projects & Organizations * [Oxford Computer Society](http://www.ox.compsoc.net/) * [Russian OpenBSD Community wiki](http://wiki.openbsd.ru/) * [Arcada Project](http://arcadaproject.org/) +* [*BSD UNIX user group in Denmark](http://www.bsd-dk.dk/) Personal sites and blogs ======================== @@ -175,3 +176,4 @@ Personal sites and blogs * [James' Tech Notes](http://jamestechnotes.com) My technical notes, blog, wiki, personal site. * [Salient Dream](http://www.salientdream.com/) - All Things Strange. * [Kafe-in.net](https://www.kafe-in.net/) Ugly personnal blog. +* [Anton Berezin's blog](http://blog.tobez.org/) From aa374ac96b1c3f669ac5b51d664427d7c5813afe Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik" Date: Mon, 5 Mar 2012 14:44:36 -0400 Subject: [PATCH 133/849] Added a comment --- .../comment_1_c505be6a13651c397fb803dd4117acce._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/Problem_with_gitweb/comment_1_c505be6a13651c397fb803dd4117acce._comment diff --git a/doc/forum/Problem_with_gitweb/comment_1_c505be6a13651c397fb803dd4117acce._comment b/doc/forum/Problem_with_gitweb/comment_1_c505be6a13651c397fb803dd4117acce._comment new file mode 100644 index 000000000..0a492fa49 --- /dev/null +++ b/doc/forum/Problem_with_gitweb/comment_1_c505be6a13651c397fb803dd4117acce._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik" + nickname="micheal" + subject="comment 1" + date="2012-03-05T18:44:36Z" + content=""" +Any Ideas what I could do? +"""]] From 748b4a0886eb628a54dcea02e2af94fd78d7d033 Mon Sep 17 00:00:00 2001 From: jaime Date: Mon, 5 Mar 2012 15:52:02 -0400 Subject: [PATCH 134/849] Added a comment: ikiwiki version 3.20120203 --- .../comment_4_e37d1497acafd3fda547462f000636e3._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/attachments_fail_to_upload/comment_4_e37d1497acafd3fda547462f000636e3._comment diff --git a/doc/forum/attachments_fail_to_upload/comment_4_e37d1497acafd3fda547462f000636e3._comment b/doc/forum/attachments_fail_to_upload/comment_4_e37d1497acafd3fda547462f000636e3._comment new file mode 100644 index 000000000..148c7b799 --- /dev/null +++ b/doc/forum/attachments_fail_to_upload/comment_4_e37d1497acafd3fda547462f000636e3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="jaime" + ip="201.141.91.196" + subject="ikiwiki version 3.20120203" + date="2012-03-05T19:52:02Z" + content=""" +I installed ikiwiki version 3.20120203 from source. Should I pull more recent changes from the repo? +"""]] From 41af1c62fe3bf326cc31e49ef6eee8c06dffd498 Mon Sep 17 00:00:00 2001 From: jaime Date: Mon, 5 Mar 2012 16:05:12 -0400 Subject: [PATCH 135/849] --- doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn b/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn index cdfb860a9..a92d10ac2 100644 --- a/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn +++ b/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn @@ -4,3 +4,8 @@ This is very minor. Noticed in nginx's logs that jquery-ui.min.css (the attachme > running? I don't want to include a lot of files that jquery only > uses in other situations. The currently included files are exactly those > that I see it try to use. --[[Joey]] + +Fair enough. These 3 files are the only ones that appear consistently in nginx error logs. +ui-bg_glass_75_dadada_1x400.png +ui-icons_454545_256x240.png +ui-bg_glass_95_fef1ec_1x400.png From 5f2ad7b36e3e351963e4f1c47fcc4bfb5e0fff47 Mon Sep 17 00:00:00 2001 From: "http://joey.kitenet.net/" Date: Mon, 5 Mar 2012 16:48:51 -0400 Subject: [PATCH 136/849] Added a comment --- ...omment_5_da03f9c4917cb1ef52de984b8ba86b68._comment | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/forum/attachments_fail_to_upload/comment_5_da03f9c4917cb1ef52de984b8ba86b68._comment diff --git a/doc/forum/attachments_fail_to_upload/comment_5_da03f9c4917cb1ef52de984b8ba86b68._comment b/doc/forum/attachments_fail_to_upload/comment_5_da03f9c4917cb1ef52de984b8ba86b68._comment new file mode 100644 index 000000000..dbe0d6574 --- /dev/null +++ b/doc/forum/attachments_fail_to_upload/comment_5_da03f9c4917cb1ef52de984b8ba86b68._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2012-03-05T20:48:50Z" + content=""" +Your version already contains the unicode fix, which was commit 1572c3c376df36ea09e27a1ea437e3a75cdf0f84. + +I think it's possible that the javascript file upload widget is timing out waiting for a response from ikiwiki when uploading the file. Since this is a slow CPU, it might exceed some limit in that code. At this point all I know is that the javascript file upload widget is setting an error flag, which is displayed as \"failed!\" in red. The next step is probably to get a http protocol analizer like firebug and see what if anything is being returned by the ikiwiki.cgi when the attachment is uploaded to it -- it should return some JSON with a `stored_msg` field. + +"""]] From 4c6e39cb07a9d6886c8bc78d515460c2cebba05f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 5 Mar 2012 16:54:54 -0400 Subject: [PATCH 137/849] Add a few missing jquery UI icons to attachment upload widget underlay. --- debian/changelog | 1 + ...uery-ui.min.css_missing_some_image_files.mdwn | 3 +++ .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ikiwiki/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../ikiwiki/images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../ikiwiki/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes 10 files changed, 4 insertions(+) create mode 100644 underlays/attachment/ikiwiki/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 underlays/attachment/ikiwiki/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 underlays/attachment/ikiwiki/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 underlays/attachment/ikiwiki/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 underlays/attachment/ikiwiki/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 underlays/attachment/ikiwiki/images/ui-icons_2e83ff_256x240.png create mode 100644 underlays/attachment/ikiwiki/images/ui-icons_454545_256x240.png create mode 100644 underlays/attachment/ikiwiki/images/ui-icons_cd0a0a_256x240.png diff --git a/debian/changelog b/debian/changelog index 97e51f523..ceefb64e3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -11,6 +11,7 @@ ikiwiki (3.20120203) UNRELEASED; urgency=low wikilinks between pages containing waypoints. Thanks to Blars Blarson and Antoine Beaupré, as well as the worldwide OpenStreetMap community for this utter awesomeness. + * Add a few missing jquery UI icons to attachment upload widget underlay. -- Joey Hess Wed, 08 Feb 2012 16:07:00 -0400 diff --git a/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn b/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn index a92d10ac2..dd026f4ec 100644 --- a/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn +++ b/doc/bugs/jquery-ui.min.css_missing_some_image_files.mdwn @@ -9,3 +9,6 @@ Fair enough. These 3 files are the only ones that appear consistently in nginx e ui-bg_glass_75_dadada_1x400.png ui-icons_454545_256x240.png ui-bg_glass_95_fef1ec_1x400.png + +> Hmm, that's most of the missing ones. I just added them all. [[done]] +> --[[Joey]] diff --git a/underlays/attachment/ikiwiki/images/ui-bg_flat_0_aaaaaa_40x100.png b/underlays/attachment/ikiwiki/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/underlays/attachment/ikiwiki/images/ui-bg_glass_55_fbf9ee_1x400.png b/underlays/attachment/ikiwiki/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3d6346e00f246102f72f2e026ed0491988b394 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v literal 0 HcmV?d00001 diff --git a/underlays/attachment/ikiwiki/images/ui-bg_glass_65_ffffff_1x400.png b/underlays/attachment/ikiwiki/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/underlays/attachment/ikiwiki/images/ui-bg_glass_75_dadada_1x400.png b/underlays/attachment/ikiwiki/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/underlays/attachment/ikiwiki/images/ui-icons_2e83ff_256x240.png b/underlays/attachment/ikiwiki/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..45e8928e5284adacea3f9ec07b9b50667d2ac65f GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/underlays/attachment/ikiwiki/images/ui-icons_454545_256x240.png b/underlays/attachment/ikiwiki/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec70d11bfb2f77374dfd00ef61ba0c3647b5a0c GIT binary patch literal 4369 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 k*Kv;w;*%(i9W@fAqs5i2wiq literal 0 HcmV?d00001 diff --git a/underlays/attachment/ikiwiki/images/ui-icons_cd0a0a_256x240.png b/underlays/attachment/ikiwiki/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..7930a558099bc8d92b4264eb67a0f040460f4a4f GIT binary patch literal 4369 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 literal 0 HcmV?d00001 From d913e856d561799b1a64eebb1086ab6641c703ed Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 5 Mar 2012 17:01:14 -0400 Subject: [PATCH 138/849] commnets --- doc/todo/do_not_make_links_backwards.mdwn | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/todo/do_not_make_links_backwards.mdwn b/doc/todo/do_not_make_links_backwards.mdwn index 13770b379..09b1b9b59 100644 --- a/doc/todo/do_not_make_links_backwards.mdwn +++ b/doc/todo/do_not_make_links_backwards.mdwn @@ -29,3 +29,14 @@ The following needs to be done: > see [[link plugin perhaps too general?]] for details. The basewiki > could use `\[[!link to=b desc=a]]` whenever it needs `\[[a|b]]`-style > links, maybe? --[[smcv]] + +>> It could, but it would be a pain to remember to do that. +>> +>> I feel that this should probably be a flag day transition because +>> otherwise there will be a lot of variation between how different +>> ikiwikis handle links, which is even worse than the current variation +>> between ikiwiki and other wikis! +>> +>> There are quite likely ikiwiki page generators that build wikilinks +>> too. One that's part of ikiwiki itself is `change.tmpl`. There may be +>> others... --[[Joey]] From 4dded4e5ab141b5515c7f14e91f80b9572273597 Mon Sep 17 00:00:00 2001 From: "http://joey.kitenet.net/" Date: Mon, 5 Mar 2012 17:08:45 -0400 Subject: [PATCH 139/849] Added a comment --- ...comment_2_23cc0d87448d3cbdac20a005e9191589._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/forum/Problem_with_gitweb/comment_2_23cc0d87448d3cbdac20a005e9191589._comment diff --git a/doc/forum/Problem_with_gitweb/comment_2_23cc0d87448d3cbdac20a005e9191589._comment b/doc/forum/Problem_with_gitweb/comment_2_23cc0d87448d3cbdac20a005e9191589._comment new file mode 100644 index 000000000..f80bd38d8 --- /dev/null +++ b/doc/forum/Problem_with_gitweb/comment_2_23cc0d87448d3cbdac20a005e9191589._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2012-03-05T21:08:45Z" + content=""" +This seems entirely a gitweb configuration problem, so look at `/etc/gitweb.conf` + +Or, if you are able to navigate to a gitweb url that does show your wiki's source, fix up ikiwiki's `historyurl` to use the url that works. +"""]] From 5b5da9fff4ff4c2a4df20f58c2dabff0ca75e588 Mon Sep 17 00:00:00 2001 From: "http://kerravonsen.dreamwidth.org/" Date: Mon, 5 Mar 2012 21:32:20 -0400 Subject: [PATCH 140/849] thoughts on dealing with basewiki links --- doc/todo/do_not_make_links_backwards.mdwn | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/todo/do_not_make_links_backwards.mdwn b/doc/todo/do_not_make_links_backwards.mdwn index 09b1b9b59..7f54c26f7 100644 --- a/doc/todo/do_not_make_links_backwards.mdwn +++ b/doc/todo/do_not_make_links_backwards.mdwn @@ -40,3 +40,9 @@ The following needs to be done: >> There are quite likely ikiwiki page generators that build wikilinks >> too. One that's part of ikiwiki itself is `change.tmpl`. There may be >> others... --[[Joey]] + +>>> Agreed that it would be cleaner to just change everything, even though the transition might be painful. + +>>> Another interim option might be to change the basewiki links to be just \[[link to whatever]] without having a description. +>>> That style of link would work whether the link style was "backwards" or "forwards". Unfortunately it could make some links less readable; after all, there is a reason why one wants to be able to change the link text! But I don't know what proportion of the links are like that. It's a thought, anyway. +>>> --[[KathrynAndersen]] From 262327e37d6ed33ecc07f8f352b00553a8ce6c96 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik" Date: Tue, 6 Mar 2012 05:50:54 -0400 Subject: [PATCH 141/849] Added a comment --- ..._697c6038009249e6a49d9e458a5ba271._comment | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 doc/forum/Problem_with_gitweb/comment_3_697c6038009249e6a49d9e458a5ba271._comment diff --git a/doc/forum/Problem_with_gitweb/comment_3_697c6038009249e6a49d9e458a5ba271._comment b/doc/forum/Problem_with_gitweb/comment_3_697c6038009249e6a49d9e458a5ba271._comment new file mode 100644 index 000000000..72eeda124 --- /dev/null +++ b/doc/forum/Problem_with_gitweb/comment_3_697c6038009249e6a49d9e458a5ba271._comment @@ -0,0 +1,47 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik" + nickname="micheal" + subject="comment 3" + date="2012-03-06T09:50:53Z" + content=""" +I don't know how to navigate to a gitweb url that does show my wiki's source. + +My gitweb.conf looks like this: + + cat /etc/gitweb.conf + # path to git projects (.git) + #$projectroot = \"/var/cache/git\"; + $projectroot = \"/home/myuser/myiki\"; + + # directory to use for temp files + $git_temp = \"/tmp\"; + + # Change This + $site_name = \"myiki\"; + + # target of the home link on top of all pages + #$home_link = $my_uri || \"/\"; + + # html text to include at home page + #$home_text = \"indextext.html\"; + + # file with project list; by default, simply scan the projectroot dir. + #$projects_list = $projectroot; + + # stylesheet to use + #@stylesheets = (\"static/gitweb.css\"); + + # javascript code for gitweb + #$javascript = \"static/gitweb.js\"; + + # logo to use + #$logo = \"static/git-logo.png\"; + + # the 'favicon' + #$favicon = \"static/git-favicon.png\"; + + # git-diff-tree(1) options to use for generated patches + #@diff_opts = (\"-M\"); + @diff_opts = (); + +"""]] From 563338a997321c3572dd3f00f4d07f99b05cbbbf Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Tue, 6 Mar 2012 10:26:48 -0400 Subject: [PATCH 142/849] comment on the feedback (thanks!) - shouldn't this be in the discussion page? --- doc/todo/do_not_make_links_backwards.mdwn | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/doc/todo/do_not_make_links_backwards.mdwn b/doc/todo/do_not_make_links_backwards.mdwn index 7f54c26f7..981005d84 100644 --- a/doc/todo/do_not_make_links_backwards.mdwn +++ b/doc/todo/do_not_make_links_backwards.mdwn @@ -19,11 +19,18 @@ The following needs to be done: 4. rewrite tests to take into account the two syntaxes (!) I would need help here, always have trouble with unit tests... 5. deal with underlays (!!) +Discussion +---------- + > It's not at all obvious to me that `rtl` should mean "link before description" > and not the other way round. Perhaps `wikilink_text_first` => `1` for the historical > IkiWiki syntax or `0` for the Creole/Mediawiki syntax? --[[smcv]] +> +> > A friend made the argument that it is more natural for a human to read the `text` then `link`, as the link is less important. Since we (occidental languages) read left to right, I felt this was appropriate. I also blindly assumed that it would "feel" also appropriate for right to left languages (arabic, hebrew, etc) to have those links backwards, and those languages are generally named "right to left". +> > +> > Originally, I named that parameter `backwards_links`, but then it wouldn't make sense in the long term, and isn't exactly neutral: it assume the current way is backwards! Your suggestion is interesting however, but I don't think the rtl/ltr nomenclature is problematic, with proper documentation of course... --[[anarcat]] - There's a caveat: we can't have a per-wiki backwards_links option, because of the underlay, common to all wikis, which needs to be converted. So the option doesn't make much sense. Not sure how to deal with this... Maybe this needs to be at the package level? +There's a caveat: we can't have a per-wiki backwards_links option, because of the underlay, common to all wikis, which needs to be converted. So the option doesn't make much sense. Not sure how to deal with this... Maybe this needs to be at the package level? --[[anarcat]] > I've thought about adding a direction-neutral `\[[!link]]` directive - > see [[link plugin perhaps too general?]] for details. The basewiki @@ -46,3 +53,6 @@ The following needs to be done: >>> Another interim option might be to change the basewiki links to be just \[[link to whatever]] without having a description. >>> That style of link would work whether the link style was "backwards" or "forwards". Unfortunately it could make some links less readable; after all, there is a reason why one wants to be able to change the link text! But I don't know what proportion of the links are like that. It's a thought, anyway. >>> --[[KathrynAndersen]] + +>>> Another option for internal links is to just use the regular markdown links instead of `\[[text|link]]` markup, that way it works regardless. Then the documentation for the link plugin just has to state both syntaxes in a safe manner. +>>> I also agree that we should just switch in one shot, although I am worried this means this could be postponed indefinitely.--[[anarcat]] From eda8c4bfc7c23b59e9daa3e93fe04fb0a09a58d5 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Wed, 7 Mar 2012 01:19:13 -0400 Subject: [PATCH 143/849] put out a rationale of why this is important, make a roadmap, note how i was able to convert the underlay and provided a script to convert wikilnks to markdown links --- doc/todo/do_not_make_links_backwards.mdwn | 29 +++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/doc/todo/do_not_make_links_backwards.mdwn b/doc/todo/do_not_make_links_backwards.mdwn index 981005d84..0db35b8fb 100644 --- a/doc/todo/do_not_make_links_backwards.mdwn +++ b/doc/todo/do_not_make_links_backwards.mdwn @@ -16,8 +16,8 @@ The following needs to be done: 1. the `link_regexp` variable needs to be turned backwards (or frontwards, if you like :P) (./) added an option for this, working! 2. a config setting need to be added to the `link` plugin so that we can choose if we want backwards links or not (./) `links_direction`, how does that sound? I have changed that from `backwards_links` to be more neutral. 'rtl' means `\[[link|text]]` and 'ltr' means `\[[text|link]]` 3. a (solid!) parser needs to be written for [[ikiwiki-transition]] to change the actual links (if necessary) (./) done! - 4. rewrite tests to take into account the two syntaxes (!) I would need help here, always have trouble with unit tests... - 5. deal with underlays (!!) + 4. rewrite tests to take into account the two syntaxes (!) would be done when we migrate to the syntax + 5. deal with underlays (./) i wrote a script to convert it to markdown Discussion ---------- @@ -56,3 +56,28 @@ There's a caveat: we can't have a per-wiki backwards_links option, because of th >>> Another option for internal links is to just use the regular markdown links instead of `\[[text|link]]` markup, that way it works regardless. Then the documentation for the link plugin just has to state both syntaxes in a safe manner. >>> I also agree that we should just switch in one shot, although I am worried this means this could be postponed indefinitely.--[[anarcat]] + +>>>> I have done just that in my branch: now the underlay only uses wikilinks in the wikilink page, elsewhere regular markdown links are used. I haven't converted the whole of the doc/ directory however, that would be left to the migration. I have written a ikiwik-transition tool to migrate from wikilink to markdown while i was there. --[[anarcat]] + +The bikeshed color should be ... +-------------------------------- + +...[blue](http://blue.bikeshed.org/) of course. :) Just to make things clear here, the "bikeshedding" potential is absolutely huge here. right to left? left to right? who's right? how could we even decide this? + +I think we can approach this rationnally: + + 1. left to right (text then link) can be considered more natural, and should therefore be supported + 2. it is supported in markdown using regular markdown links. in the proposed branch, the underlay wikilinks are converted to use regular markdown links + 3. ikiwiki links break other markup plugins, like mediawiki and creole, as those work right to left. + 4. those are recognized "standards" used by other popular sites, like Wikipedia, or any wiki supporting the Creole markup, which is [most wikis](http://www.wikicreole.org/wiki/Engines) + +Therefore, to respect interoperability and [POLA](https://en.wikipedia.org/wiki/Principle_of_least_astonishment), ikiwiki should respect that convention and reverse the way links are parsed by the link plugin, or move that functionality into creole/mediawiki modules, and out of the main core, which I do not think can be an option. + +So here's a roadmap to deploy this change: + + 1. the code in the backwards_links branch i am working on is tested and proven, then merged in + 2. a release of the 3.x branch is published with the possibility for wikis to convert to the new markup, with the notion that the older markup is deprecated + 3. this wiki is converted to the new markup + 4. 4.0 is released with the new markup enabled by default and runs ikiwiki-transition on your wiki on upgrade + +Note that ikiwiki-transition can be ran multiple and will convert your markup to and from rtl/ltr, without issues, so this is pretty sturdy. I think the configuration variable can be kept throughout 4.x, with the notion that it will be completely removed eventually. --[[anarcat]] From 5acada2f2576c10f2726396031f7fe8ed3e5fba3 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmaiXkFDzdQuS-oBG_aVABNurE4oXRyZsE" Date: Wed, 7 Mar 2012 05:48:08 -0400 Subject: [PATCH 144/849] --- doc/sandbox.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index 502bc4fec..d0e64dfe5 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -189,3 +189,5 @@ This is simple enough for now [[sandbocen]] no? Do code tags work? test by max + +Quite nice! From 62577b533e80c876961afff2eab62369e7bef2d3 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmaiXkFDzdQuS-oBG_aVABNurE4oXRyZsE" Date: Wed, 7 Mar 2012 05:48:36 -0400 Subject: [PATCH 145/849] This reverts commit 5acada2f2576c10f2726396031f7fe8ed3e5fba3 --- doc/sandbox.mdwn | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index d0e64dfe5..502bc4fec 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -189,5 +189,3 @@ This is simple enough for now [[sandbocen]] no? Do code tags work? test by max - -Quite nice! From 58cc8da99395fe6c2a880a1190f096cd016687ad Mon Sep 17 00:00:00 2001 From: jaime Date: Wed, 7 Mar 2012 21:34:57 -0400 Subject: [PATCH 146/849] Added a comment --- ..._04498946a300ddb652dec73c2950f48f._comment | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 doc/forum/attachments_fail_to_upload/comment_6_04498946a300ddb652dec73c2950f48f._comment diff --git a/doc/forum/attachments_fail_to_upload/comment_6_04498946a300ddb652dec73c2950f48f._comment b/doc/forum/attachments_fail_to_upload/comment_6_04498946a300ddb652dec73c2950f48f._comment new file mode 100644 index 000000000..877050eb5 --- /dev/null +++ b/doc/forum/attachments_fail_to_upload/comment_6_04498946a300ddb652dec73c2950f48f._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="jaime" + ip="201.141.54.196" + subject="comment 6" + date="2012-03-08T01:34:57Z" + content=""" +Ok... figured out how to use firebug, started the profile, and tried uploading an image. POST http://myserver/ikiwiki.cgi immediately turns red with a little X as I get the javascript \"failed\" message in the ui. In the post tab of firebug, halfway through the binary content of the png I can see the message \"... Firebug request size limit has been reached by Firebug. ... \" + +So next I try uploading a tiny 3k image. This time the post completes and I can see \"Error: Can't locate JSON.pm in @INC\" in the output. A bit of googling tells me I need to install the libjson-perl package. Done. + +I try and upload the tiny 3k image again. This time it works. :) +I try and upload a 9k image and the POST just dies just like before with the \"... Firebug request size limit has been reached by Firebug. ... \" in the post tab. + +So I tried changing the extensions.firebug.netDisplayedPostBodyLimit variable in firefox to see if that would me to get more info. Now the I don't get the request size limit message but the post still doesn't get anything back. + +I decided to try some other http protocal analyzers. Firefox 10 internal webdeveloper tools don't give me any more info. +Next I tried HttpFox and the only thing I get back is this... +Error loading content (NS_ERROR_DOCUMENT_NOT_CACHED) +"""]] From 9a9cdc6b25fee70769753dd6624698e46fd3f251 Mon Sep 17 00:00:00 2001 From: Jon Dowland Date: Thu, 8 Mar 2012 17:01:41 +0000 Subject: [PATCH 147/849] good idea --- doc/todo/do_not_make_links_backwards.mdwn | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/todo/do_not_make_links_backwards.mdwn b/doc/todo/do_not_make_links_backwards.mdwn index 0db35b8fb..55db32b4f 100644 --- a/doc/todo/do_not_make_links_backwards.mdwn +++ b/doc/todo/do_not_make_links_backwards.mdwn @@ -59,6 +59,11 @@ There's a caveat: we can't have a per-wiki backwards_links option, because of th >>>> I have done just that in my branch: now the underlay only uses wikilinks in the wikilink page, elsewhere regular markdown links are used. I haven't converted the whole of the doc/ directory however, that would be left to the migration. I have written a ikiwik-transition tool to migrate from wikilink to markdown while i was there. --[[anarcat]] +---- + +FWIW, I think this change may well be painful, but is a good idea. I can never remember which way around it should be. +Rather like USB plugs, I invariably have to try both ways. — [[Jon]] + The bikeshed color should be ... -------------------------------- From 22146f4518a00d9c38d9254581cbbbefc68dc1d5 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY" Date: Mon, 12 Mar 2012 20:55:59 -0400 Subject: [PATCH 148/849] --- ...r:_Cannot_decode_string_with_wide_characters.mdwn | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/forum/build_error:_Cannot_decode_string_with_wide_characters.mdwn diff --git a/doc/forum/build_error:_Cannot_decode_string_with_wide_characters.mdwn b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters.mdwn new file mode 100644 index 000000000..282227e0f --- /dev/null +++ b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters.mdwn @@ -0,0 +1,12 @@ + $ ikiwiki -setup mywiki.setup + generating wrappers.. + rebuilding wiki.. + Cannot decode string with wide characters at /opt/local/lib/perl5/5.12.3/darwin-multi-2level/Encode.pm line 175. + +I am running Mac OS X 10.6.8 + + $ ikiwiki --version + ikiwiki version 3.20110608 + $ perl --version + + This is perl 5, version 12, subversion 3 (v5.12.3) built for darwin-multi-2level From 763c0dd3790f62ebc11aa6a1cb68a2a5def5ad6b Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY" Date: Mon, 12 Mar 2012 20:56:43 -0400 Subject: [PATCH 149/849] --- ...not_decode_string_with_wide_characters.mdwn | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/forum/build_error:_Cannot_decode_string_with_wide_characters.mdwn b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters.mdwn index 282227e0f..2e5ac7e6e 100644 --- a/doc/forum/build_error:_Cannot_decode_string_with_wide_characters.mdwn +++ b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters.mdwn @@ -1,12 +1,12 @@ - $ ikiwiki -setup mywiki.setup - generating wrappers.. - rebuilding wiki.. - Cannot decode string with wide characters at /opt/local/lib/perl5/5.12.3/darwin-multi-2level/Encode.pm line 175. + $ ikiwiki -setup mywiki.setup + generating wrappers.. + rebuilding wiki.. + Cannot decode string with wide characters at /opt/local/lib/perl5/5.12.3/darwin-multi-2level/Encode.pm line 175. I am running Mac OS X 10.6.8 - $ ikiwiki --version - ikiwiki version 3.20110608 - $ perl --version - - This is perl 5, version 12, subversion 3 (v5.12.3) built for darwin-multi-2level + $ ikiwiki --version + ikiwiki version 3.20110608 + $ perl --version + + This is perl 5, version 12, subversion 3 (v5.12.3) built for darwin-multi-2level From 2234ee17e827cc23dba4592ec2cf717ecf3d7055 Mon Sep 17 00:00:00 2001 From: "http://joey.kitenet.net/" Date: Mon, 12 Mar 2012 23:57:42 -0400 Subject: [PATCH 150/849] Added a comment --- .../comment_1_83fbb415dd3ae6a19ed5ea5f82065c28._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_1_83fbb415dd3ae6a19ed5ea5f82065c28._comment diff --git a/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_1_83fbb415dd3ae6a19ed5ea5f82065c28._comment b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_1_83fbb415dd3ae6a19ed5ea5f82065c28._comment new file mode 100644 index 000000000..d1b555b2a --- /dev/null +++ b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_1_83fbb415dd3ae6a19ed5ea5f82065c28._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-03-13T03:57:42Z" + content=""" +The problem could be your system's locale setting. Perhaps LANG is not set to a utf-8 capable locale. +"""]] From d903f2c2fa337c28ef1369caa606dd012100ad4e Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY" Date: Tue, 13 Mar 2012 00:43:26 -0400 Subject: [PATCH 151/849] Added a comment --- ..._d258536c98538d4744f66eb3132439a9._comment | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_2_d258536c98538d4744f66eb3132439a9._comment diff --git a/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_2_d258536c98538d4744f66eb3132439a9._comment b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_2_d258536c98538d4744f66eb3132439a9._comment new file mode 100644 index 000000000..28222618d --- /dev/null +++ b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_2_d258536c98538d4744f66eb3132439a9._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY" + nickname="FName" + subject="comment 2" + date="2012-03-13T04:43:25Z" + content=""" + $ locale + LANG=\"en_US.UTF-8\" + LC_COLLATE=\"en_US.UTF-8\" + LC_CTYPE=\"en_US.UTF-8\" + LC_MESSAGES=\"en_US.UTF-8\" + LC_MONETARY=\"en_US.UTF-8\" + LC_NUMERIC=\"en_US.UTF-8\" + LC_TIME=\"en_US.UTF-8\" + LC_ALL= + $ uname -a + Darwin x4430 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386 + +Does it look OK? +"""]] From f0733e6b9650e518edbc635b7fdb22b44155732d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 13 Mar 2012 11:49:29 -0400 Subject: [PATCH 152/849] URI escape filename when generating the diffurl. ikiwiki source files can contain at least one character that needs to be escaped in an url: + --- IkiWiki/Plugin/bzr.pm | 5 ++++- IkiWiki/Plugin/cvs.pm | 4 +++- IkiWiki/Plugin/darcs.pm | 4 +++- IkiWiki/Plugin/git.pm | 4 +++- IkiWiki/Plugin/mercurial.pm | 4 +++- IkiWiki/Plugin/monotone.pm | 4 +++- IkiWiki/Plugin/svn.pm | 4 +++- IkiWiki/Plugin/tla.pm | 4 +++- debian/changelog | 1 + 9 files changed, 26 insertions(+), 8 deletions(-) diff --git a/IkiWiki/Plugin/bzr.pm b/IkiWiki/Plugin/bzr.pm index 3bc4ea8dd..72552abcc 100644 --- a/IkiWiki/Plugin/bzr.pm +++ b/IkiWiki/Plugin/bzr.pm @@ -5,6 +5,7 @@ use warnings; use strict; use IkiWiki; use Encode; +use URI::Escape q{uri_escape_utf8}; use open qw{:utf8 :std}; sub import { @@ -242,8 +243,10 @@ sub rcs_recentchanges ($) { # Skip source name in renames $filename =~ s/^.* => //; + my $efilename = uri_escape_utf8($filename); + my $diffurl = defined $config{'diffurl'} ? $config{'diffurl'} : ""; - $diffurl =~ s/\[\[file\]\]/$filename/go; + $diffurl =~ s/\[\[file\]\]/$efilename/go; $diffurl =~ s/\[\[file-id\]\]/$fileid/go; $diffurl =~ s/\[\[r2\]\]/$info->{revno}/go; diff --git a/IkiWiki/Plugin/cvs.pm b/IkiWiki/Plugin/cvs.pm index 0a6cbfaf6..788f51167 100644 --- a/IkiWiki/Plugin/cvs.pm +++ b/IkiWiki/Plugin/cvs.pm @@ -33,6 +33,7 @@ use warnings; use strict; use IkiWiki; +use URI::Escape q{uri_escape_utf8}; use File::chdir; @@ -315,7 +316,8 @@ sub rcs_recentchanges ($) { $oldrev =~ s/INITIAL/0/; $newrev =~ s/\(DEAD\)//; my $diffurl = defined $config{diffurl} ? $config{diffurl} : ""; - $diffurl=~s/\[\[file\]\]/$page/g; + my $epage = uri_escape_utf8($page); + $diffurl=~s/\[\[file\]\]/$epage/g; $diffurl=~s/\[\[r1\]\]/$oldrev/g; $diffurl=~s/\[\[r2\]\]/$newrev/g; unshift @pages, { diff --git a/IkiWiki/Plugin/darcs.pm b/IkiWiki/Plugin/darcs.pm index 1313041e7..646f65df1 100644 --- a/IkiWiki/Plugin/darcs.pm +++ b/IkiWiki/Plugin/darcs.pm @@ -3,6 +3,7 @@ package IkiWiki::Plugin::darcs; use warnings; use strict; +use URI::Escape q{uri_escape_utf8}; use IkiWiki; sub import { @@ -336,7 +337,8 @@ sub rcs_recentchanges ($) { foreach my $f (@files) { my $d = defined $config{'diffurl'} ? $config{'diffurl'} : ""; - $d =~ s/\[\[file\]\]/$f/go; + my $ef = uri_escape_utf8($f); + $d =~ s/\[\[file\]\]/$ef/go; $d =~ s/\[\[hash\]\]/$hash/go; push @pg, { diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm index 3dd910cd5..535cd5fe0 100644 --- a/IkiWiki/Plugin/git.pm +++ b/IkiWiki/Plugin/git.pm @@ -5,6 +5,7 @@ use warnings; use strict; use IkiWiki; use Encode; +use URI::Escape q{uri_escape_utf8}; use open qw{:utf8 :std}; my $sha1_pattern = qr/[0-9a-fA-F]{40}/; # pattern to validate Git sha1sums @@ -617,9 +618,10 @@ sub rcs_recentchanges ($) { my @pages; foreach my $detail (@{ $ci->{'details'} }) { my $file = $detail->{'file'}; + my $efile = uri_escape_utf8($file); my $diffurl = defined $config{'diffurl'} ? $config{'diffurl'} : ""; - $diffurl =~ s/\[\[file\]\]/$file/go; + $diffurl =~ s/\[\[file\]\]/$efile/go; $diffurl =~ s/\[\[sha1_parent\]\]/$ci->{'parent'}/go; $diffurl =~ s/\[\[sha1_from\]\]/$detail->{'sha1_from'}/go; $diffurl =~ s/\[\[sha1_to\]\]/$detail->{'sha1_to'}/go; diff --git a/IkiWiki/Plugin/mercurial.pm b/IkiWiki/Plugin/mercurial.pm index b7fe01485..8da4ceb07 100644 --- a/IkiWiki/Plugin/mercurial.pm +++ b/IkiWiki/Plugin/mercurial.pm @@ -5,6 +5,7 @@ use warnings; use strict; use IkiWiki; use Encode; +use URI::Escape q{uri_escape_utf8}; use open qw{:utf8 :std}; sub import { @@ -265,7 +266,8 @@ sub rcs_recentchanges ($) { foreach my $file (split / /,$info->{files}) { my $diffurl = defined $config{diffurl} ? $config{'diffurl'} : ""; - $diffurl =~ s/\[\[file\]\]/$file/go; + my $efile = uri_escape_utf8($file); + $diffurl =~ s/\[\[file\]\]/$efile/go; $diffurl =~ s/\[\[r2\]\]/$info->{changeset}/go; push @pages, { diff --git a/IkiWiki/Plugin/monotone.pm b/IkiWiki/Plugin/monotone.pm index 1d89e3f6b..105627814 100644 --- a/IkiWiki/Plugin/monotone.pm +++ b/IkiWiki/Plugin/monotone.pm @@ -7,6 +7,7 @@ use IkiWiki; use Monotone; use Date::Parse qw(str2time); use Date::Format qw(time2str); +use URI::Escape q{uri_escape_utf8}; my $sha1_pattern = qr/[0-9a-fA-F]{40}/; # pattern to validate sha1sums my $mtn_version = undef; @@ -593,7 +594,8 @@ sub rcs_recentchanges ($) { my $diffurl=$config{diffurl}; $diffurl=~s/\[\[r1\]\]/$parent/g; $diffurl=~s/\[\[r2\]\]/$rev/g; - $diffurl=~s/\[\[file\]\]/$file/g; + my $efile = uri_escape_utf8($file); + $diffurl=~s/\[\[file\]\]/$efile/g; push @pages, { page => pagename($file), diffurl => $diffurl, diff --git a/IkiWiki/Plugin/svn.pm b/IkiWiki/Plugin/svn.pm index 8824a6ce0..fd11f2c63 100644 --- a/IkiWiki/Plugin/svn.pm +++ b/IkiWiki/Plugin/svn.pm @@ -5,6 +5,7 @@ use warnings; use strict; use IkiWiki; use POSIX qw(setlocale LC_CTYPE); +use URI::Escape q{uri_escape_utf8}; sub import { hook(type => "checkconfig", id => "svn", call => \&checkconfig); @@ -292,7 +293,8 @@ sub rcs_recentchanges ($) { } my $diffurl=defined $config{diffurl} ? $config{diffurl} : ""; - $diffurl=~s/\[\[file\]\]/$file/g; + my $efile = uri_escape_utf8($file); + $diffurl=~s/\[\[file\]\]/$efile/g; $diffurl=~s/\[\[r1\]\]/$rev - 1/eg; $diffurl=~s/\[\[r2\]\]/$rev/g; diff --git a/IkiWiki/Plugin/tla.pm b/IkiWiki/Plugin/tla.pm index da4385446..11be248e8 100644 --- a/IkiWiki/Plugin/tla.pm +++ b/IkiWiki/Plugin/tla.pm @@ -4,6 +4,7 @@ package IkiWiki::Plugin::tla; use warnings; use strict; use IkiWiki; +use URI::Escape q{uri_escape_utf8}; sub import { hook(type => "checkconfig", id => "tla", call => \&checkconfig); @@ -224,7 +225,8 @@ sub rcs_recentchanges ($) { foreach my $file (@paths) { my $diffurl=defined $config{diffurl} ? $config{diffurl} : ""; - $diffurl=~s/\[\[file\]\]/$file/g; + my $efile = uri_escape_utf8($file); + $diffurl=~s/\[\[file\]\]/$efile/g; $diffurl=~s/\[\[rev\]\]/$change/g; push @pages, { page => pagename($file), diff --git a/debian/changelog b/debian/changelog index ceefb64e3..d6b71eaa3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,6 +12,7 @@ ikiwiki (3.20120203) UNRELEASED; urgency=low Thanks to Blars Blarson and Antoine Beaupré, as well as the worldwide OpenStreetMap community for this utter awesomeness. * Add a few missing jquery UI icons to attachment upload widget underlay. + * URI escape filename when generating the diffurl. -- Joey Hess Wed, 08 Feb 2012 16:07:00 -0400 From 90c07225f436c5dfb043c13eadd7962a95621f27 Mon Sep 17 00:00:00 2001 From: cslotty Date: Tue, 13 Mar 2012 13:08:53 -0400 Subject: [PATCH 153/849] --- doc/basewiki/sandbox.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/basewiki/sandbox.mdwn b/doc/basewiki/sandbox.mdwn index c66534fc2..e76bdb8d1 100644 --- a/doc/basewiki/sandbox.mdwn +++ b/doc/basewiki/sandbox.mdwn @@ -30,3 +30,5 @@ Bulleted list * item [[ikiwiki/WikiLink]] + +[[!calendar type="month" pages="blog/*"]] From a0e071739405787cb1c0c7151c62567178cd2e8c Mon Sep 17 00:00:00 2001 From: cslotty Date: Tue, 13 Mar 2012 15:08:50 -0400 Subject: [PATCH 154/849] Question about experience with this requirements engineering tool as modelled --- .../ikiwiki_as_a_requirements_management_tool/discussion.mdwn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/tips/ikiwiki_as_a_requirements_management_tool/discussion.mdwn b/doc/tips/ikiwiki_as_a_requirements_management_tool/discussion.mdwn index 94f0f8b4b..26eae28a5 100644 --- a/doc/tips/ikiwiki_as_a_requirements_management_tool/discussion.mdwn +++ b/doc/tips/ikiwiki_as_a_requirements_management_tool/discussion.mdwn @@ -16,3 +16,6 @@ This could be as simple as adding a link, fo e.g. : + \[[attributes/non-functional]] You just have to create pages for each attribute you want and then pagespec could be used to filter requirements by attributes. I think something similar is used to trac bug with ikiwiki (linking to a \[[done]] page, etc.). + +--- +Generally speaking, I think it's always a good idea to get back to the "basics" for something, that huge and expensive tools were made for. But I'm doubtful if such a text oriented tool would really fit all needs of a requirements engineering tool... so what is your real world experience with your requirements engineering tool as described? From a1d7aad40119cd3f2bc970fc7ce10625d0da7106 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 13 Mar 2012 17:16:09 -0400 Subject: [PATCH 155/849] fix writing of kml file It just didn't work, but also, it didn't use writefile, which is not desirable for security. Fixed both issues. Also removed some unnecessary debug messages. --- IkiWiki/Plugin/osm.pm | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index 2b5d0d5f1..47c752881 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -341,8 +341,7 @@ sub writejson($;$) { "geometry" => { "type" => "LineString", "coordinates" => $linestring }); push @{$geojson{'features'}}, \%json; } - debug('writing pois file pois.json in ' . $config{destdir} . "/$map"); - writefile("pois.json",$config{destdir} . "/$map",to_json(\%geojson)); + writefile("pois.json", $config{destdir} . "/$map", to_json(\%geojson)); } } @@ -352,7 +351,6 @@ sub writekml($;$) { eval q{use XML::Writer}; error $@ if $@; foreach my $map (keys %waypoints) { - debug("writing pois file pois.kml in " . $config{destdir} . "/$map"); =pod Sample placemark: @@ -388,10 +386,9 @@ Sample style: =cut - use IO::File; - my $output = IO::File->new(">".$config{destdir} . "/$map/pois.kml"); - - my $writer = XML::Writer->new( OUTPUT => $output, DATA_MODE => 1, ENCODING => 'UTF-8'); + my $output; + my $writer = XML::Writer->new( OUTPUT => \$output, + DATA_MODE => 1, ENCODING => 'UTF-8'); $writer->xmlDecl(); $writer->startTag("kml", "xmlns" => "http://www.opengis.net/kml/2.2"); @@ -454,7 +451,8 @@ Sample style: } $writer->endTag(); $writer->end(); - $output->close(); + + writefile("pois.kmp", $config{destdir} . "/$map", $output); } } @@ -472,8 +470,7 @@ sub writecsvs($;$) { $options{'icon'} . "\n"; $poisf .= $line; } - debug("writing pois file pois.txt in " . $config{destdir} . "/$map"); - writefile("pois.txt",$config{destdir} . "/$map",$poisf); + writefile("pois.txt", $config{destdir} . "/$map", $poisf); } } From 5a7f1ebcd4d00bb1ba163c9559435f6c0aa78fb4 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 13 Mar 2012 17:35:06 -0400 Subject: [PATCH 156/849] various fixes to links Build links the right way. This also involved dropping that leading slash on the osm_default_icon. And since it would require changing the old osm_tag_icons too, I just removed that relic. --- IkiWiki/Plugin/osm.pm | 56 ++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 36 deletions(-) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index 47c752881..9f43e03e6 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -34,8 +34,8 @@ sub getsetup () { }, osm_default_icon => { type => "string", - example => "/ikiwiki/images/osm.png", - description => "the icon shon on links and on the main map", + example => "ikiwiki/images/osm.png", + description => "the icon shown on links and on the main map", safe => 0, rebuild => 1, }, @@ -56,17 +56,7 @@ sub getsetup () { osm_tag_default_icon => { type => "string", example => "icon.png", - description => "the icon attached to a tag so that pages tagged with that tag will have that icon on the map", - safe => 0, - rebuild => 1, - }, - osm_tag_icons => { - type => "string", - example => { - 'test' => '/img/test.png', - 'trailer' => '/img/trailer.png' - }, - description => "tag to icon mapping, leading slash is important!", + description => "the icon attached to a tag, displayed on the map for tagged pages", safe => 0, rebuild => 1, }, @@ -137,7 +127,7 @@ sub process_waypoint { my $name = scrub($params{'name'} || $p, $page, $dest); # sanitized here my $desc = scrub($params{'desc'} || '', $page, $dest); # sanitized here my $zoom = scrub($params{'zoom'} // $config{'osm_default_zoom'} // 15, $page, $dest); # sanitized below - my $icon = $config{'osm__default_icon'} || "/ikiwiki/images/osm.png"; # sanitized: we trust $config + my $icon = $config{'osm_default_icon'} || "ikiwiki/images/osm.png"; # sanitized: we trust $config my $map = scrub($params{'map'} || 'map', $page, $dest); # sanitized here my $alt = $config{'osm_alt'} ? "alt=\"$config{'osm_alt'}\"" : ''; # sanitized: we trust $config if ($zoom !~ /^\d\d?$/ || $zoom < 2 || $zoom > 18) { @@ -150,26 +140,18 @@ sub process_waypoint { } my $tag = $params{'tag'}; - if ($tag) { - if (!defined($config{'osm_tag_icons'}->{$tag})) { - error("invalid tag specified, see osm_tag_icons configuration or don't specify any"); + foreach my $t (keys %{$typedlinks{$page}{'tag'}}) { + if ($icon = get_tag_icon($t)) { + $tag = $t; + last; } - $icon = $config{'osm_tag_icons'}->{$tag}; - } - else { - foreach my $t (keys %{$typedlinks{$page}{'tag'}}) { - if ($icon = get_tag_icon($t)) { - $tag = $t; - last; - } - $t =~ s!/$config{'tagbase'}/!!; - if ($icon = get_tag_icon($t)) { - $tag = $t; - last; - } + $t =~ s!/$config{'tagbase'}/!!; + if ($icon = get_tag_icon($t)) { + $tag = $t; + last; } } - $icon = "/ikiwiki/images/osm.png" unless $icon; + $icon = urlto($icon, $dest); $tag = '' unless $tag; if ($page eq $dest) { if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { @@ -186,7 +168,13 @@ sub process_waypoint { will_render($page,$config{destdir} . "/$map/pois.kml"); } } - my $href = "/ikiwiki.cgi?do=osm&map=$map&lat=$lat&lon=$lon&zoom=$zoom"; + my $href = IkiWiki::cgiurl( + do => "osm", + map => $map, + lat => $lat, + lon => $lon, + zoom => $zoom, + ); if (defined($destsources{htmlpage($map)})) { $href = urlto($map,$page) . "?lat=$lat&lon=$lon&zoom=$zoom"; } @@ -222,10 +210,6 @@ sub get_tag_icon($) { if (srcfile($attached)) { return $attached; } - # look for the old way: mappings - if ($config{'osm_tag_icons'}->{$tag}) { - return $config{'osm_tag_icons'}->{$tag}; - } else { return undef; } From 5b5731182f99808f533d691408dc651a435be43b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 13 Mar 2012 17:48:27 -0400 Subject: [PATCH 157/849] avoid double amp escaping --- IkiWiki/Plugin/osm.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index 9f43e03e6..91f23ba1f 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -176,7 +176,8 @@ sub process_waypoint { zoom => $zoom, ); if (defined($destsources{htmlpage($map)})) { - $href = urlto($map,$page) . "?lat=$lat&lon=$lon&zoom=$zoom"; + $href = urlto($map,$page) . "?lat=$lat&lon=$lon&zoom=$zoom"; + $href =~ s!&!&!g; } $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = { page => $page, @@ -196,7 +197,6 @@ sub process_waypoint { $output .= preprocess(%params); } if (!$hidden) { - $href =~ s!&!&!g; $output .= ""; } return $output; From 9fad75fd53c75b6c9f7729b6c7e6eccbc3cff39d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 13 Mar 2012 17:49:41 -0400 Subject: [PATCH 158/849] make icon absolute it is put into kml files, etc --- IkiWiki/Plugin/osm.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index 91f23ba1f..be499495c 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -151,7 +151,7 @@ sub process_waypoint { last; } } - $icon = urlto($icon, $dest); + $icon = urlto($icon, $dest, 1); $tag = '' unless $tag; if ($page eq $dest) { if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { From 3cfcf16e32e28259294103b1268431212d0cd11e Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" Date: Tue, 13 Mar 2012 19:50:28 -0400 Subject: [PATCH 159/849] --- ..._all_moderated_comments_into_special_branch__63__.mdwn | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/Commiting_all_moderated_comments_into_special_branch__63__.mdwn diff --git a/doc/forum/Commiting_all_moderated_comments_into_special_branch__63__.mdwn b/doc/forum/Commiting_all_moderated_comments_into_special_branch__63__.mdwn new file mode 100644 index 000000000..b734d5582 --- /dev/null +++ b/doc/forum/Commiting_all_moderated_comments_into_special_branch__63__.mdwn @@ -0,0 +1,8 @@ +I only interact with ikiwiki via cli & git; thus I would love to be able to moderate comments via git from all remote checkouts without being forced to ssh to my server and do that locally. + +Is anyone aware of a way to check all comments into a special branch, possibly called "moderation", and with a normal suffix, not "_comment_pending"? That would allow me to cherry-pick from that branch without having to remember to rename and simply delete all spam etc from the branch. + +Every now and then, I could delete the whole branch, thus cleaning out crud. As the approved comments live in master, that would not be a problem. + + +Richard From be6fe03035259cf85a8b68e447ed405eb458d76c Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" Date: Tue, 13 Mar 2012 19:51:12 -0400 Subject: [PATCH 160/849] Change signature --- ...miting_all_moderated_comments_into_special_branch__63__.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/forum/Commiting_all_moderated_comments_into_special_branch__63__.mdwn b/doc/forum/Commiting_all_moderated_comments_into_special_branch__63__.mdwn index b734d5582..e45069c63 100644 --- a/doc/forum/Commiting_all_moderated_comments_into_special_branch__63__.mdwn +++ b/doc/forum/Commiting_all_moderated_comments_into_special_branch__63__.mdwn @@ -5,4 +5,4 @@ Is anyone aware of a way to check all comments into a special branch, possibly c Every now and then, I could delete the whole branch, thus cleaning out crud. As the approved comments live in master, that would not be a problem. -Richard +RichiH From 2b76a4e7b850f2c53c20e14d399909f4f5de8a46 Mon Sep 17 00:00:00 2001 From: "http://cgray.myopenid.com/" Date: Wed, 14 Mar 2012 16:33:24 -0400 Subject: [PATCH 161/849] --- doc/todo/org_mode.mdwn | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/todo/org_mode.mdwn b/doc/todo/org_mode.mdwn index ef7f4dbaf..bb3b7dec0 100644 --- a/doc/todo/org_mode.mdwn +++ b/doc/todo/org_mode.mdwn @@ -22,14 +22,15 @@ new plugin ========== A complete rewrite of the plugin can be found -[here][chrismgray-rewrite]. It is an [[external|plugins/write/external]] plugin using a +[here][chrismgray-rewrite]. It uses a dedicated emacs instance to parse the org-mode files. Thus, it should be a bit faster than the older plugin, as well as properly handling [[wikilinks|ikiwiki/wikilink]] and images, two features not present in the older -plugin. +plugin. An example of its use can be found at my [blog][chrismgray-blog]. [org-mode]: http://orgmode.org/ [MS]: http://www.golden-gryphon.com/blog/manoj/blog/2008/06/08/Using_org-mode_with_Ikiwiki/ [example]: http://blog.tremily.us/posts/Git/notes/ [raw]: http://orgmode.org/manual/Quoting-HTML-tags.html [chrismgray-rewrite]: https://github.com/chrismgray/ikiwiki-org-plugin +[chrismgray-blog]: http://chrismgray.github.com From 70ced8faacfd01fe9549693a8252bbcafd423cad Mon Sep 17 00:00:00 2001 From: chrysn Date: Thu, 15 Mar 2012 09:55:52 -0400 Subject: [PATCH 162/849] document and fix linkmap underscore issue --- doc/bugs/linkmap_displays_underscore_escapes.mdwn | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 doc/bugs/linkmap_displays_underscore_escapes.mdwn diff --git a/doc/bugs/linkmap_displays_underscore_escapes.mdwn b/doc/bugs/linkmap_displays_underscore_escapes.mdwn new file mode 100644 index 000000000..4393e1aba --- /dev/null +++ b/doc/bugs/linkmap_displays_underscore_escapes.mdwn @@ -0,0 +1,14 @@ +[[ikiwiki/directive/linkmap]]s display the file name instead of the pagetitle, showing unsightly underscore escapes and underscores instead of blanks to users. + +the attached [[!taglink patch]] fixes this; from its commit message: + + display the pagetitle() in linkmaps + + without this patch, linkmaps display underscores and underscore escape + sequences in the rendered output. + + this introduces a pageescape function, which invoces pagetitle() to get + rid of underscore escapes and wraps the resulting utf8 string + appropriately for inclusion in a dot file (using dot's html encoding + because it can represent the '\"' dyad properly, and because it doesn't + need special-casing of newlines). From ef410fd2370c90c4390d3f50f1e104f18b8d20c0 Mon Sep 17 00:00:00 2001 From: chrysn Date: Thu, 15 Mar 2012 09:57:23 -0400 Subject: [PATCH 163/849] link to attachment --- doc/bugs/linkmap_displays_underscore_escapes.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/bugs/linkmap_displays_underscore_escapes.mdwn b/doc/bugs/linkmap_displays_underscore_escapes.mdwn index 4393e1aba..3d9fb80db 100644 --- a/doc/bugs/linkmap_displays_underscore_escapes.mdwn +++ b/doc/bugs/linkmap_displays_underscore_escapes.mdwn @@ -12,3 +12,5 @@ the attached [[!taglink patch]] fixes this; from its commit message: appropriately for inclusion in a dot file (using dot's html encoding because it can represent the '\"' dyad properly, and because it doesn't need special-casing of newlines). + +see [[0001-display-the-pagetitle-in-linkmaps.patch]] for the patch. From 4e5a14bad2338ff9bfb4c545b48437681b78870a Mon Sep 17 00:00:00 2001 From: chrysn Date: Thu, 15 Mar 2012 10:02:33 -0400 Subject: [PATCH 164/849] linkmap issue: no attachment; inline patch instead --- .../linkmap_displays_underscore_escapes.mdwn | 73 ++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/doc/bugs/linkmap_displays_underscore_escapes.mdwn b/doc/bugs/linkmap_displays_underscore_escapes.mdwn index 3d9fb80db..6d96e463b 100644 --- a/doc/bugs/linkmap_displays_underscore_escapes.mdwn +++ b/doc/bugs/linkmap_displays_underscore_escapes.mdwn @@ -13,4 +13,75 @@ the attached [[!taglink patch]] fixes this; from its commit message: because it can represent the '\"' dyad properly, and because it doesn't need special-casing of newlines). -see [[0001-display-the-pagetitle-in-linkmaps.patch]] for the patch. +everything below that line is the patch as produced by git-format-patch. (btw, what's the preferred way to send patches, apart from creating a git branch somewhere?) + +--------- snap ------------
+
+From efbb1121ffdc146f5c9a481a51f23ad151b9f240 Mon Sep 17 00:00:00 2001
+From: chrysn 
+Date: Thu, 15 Mar 2012 14:38:42 +0100
+Subject: [PATCH] display the pagetitle() in linkmaps
+
+without this patch, linkmaps display underscores and underscore escape
+sequences in the rendered output.
+
+this introduces a pageescape function, which invoces pagetitle() to get
+rid of underscore escapes and wraps the resulting utf8 string
+appropriately for inclusion in a dot file (using dot's html encoding
+because it can represent the '\"' dyad properly, and because it doesn't
+need special-casing of newlines).
+---
+ IkiWiki/Plugin/linkmap.pm |   17 +++++++++++++++--
+ 1 files changed, 15 insertions(+), 2 deletions(-)
+
+diff --git a/IkiWiki/Plugin/linkmap.pm b/IkiWiki/Plugin/linkmap.pm
+index ac26e07..b5ef1a1 100644
+--- a/IkiWiki/Plugin/linkmap.pm
++++ b/IkiWiki/Plugin/linkmap.pm
+@@ -5,6 +5,7 @@ use warnings;
+ use strict;
+ use IkiWiki 3.00;
+ use IPC::Open2;
++use HTML::Entities;
+ 
+ sub import {
+        hook(type => "getsetup", id => "linkmap", call => \&getsetup);
+@@ -22,6 +23,18 @@ sub getsetup () {
+ 
+ my $mapnum=0;
+ 
++sub pageescape {
++       my $item = shift;
++       # encoding explicitly in case ikiwiki is configured to accept <> or &
++       # in file names
++       my $title = pagetitle($item, 1);
++       # it would not be necessary to encode *all* the html entities (<> would
++       # be sufficient, &" probably a good idea), as dot accepts utf8, but it
++       # isn't bad either
++       $title = encode_entities($title);
++       return("<$title>");
++}
++
+ sub preprocess (@) {
+        my %params=@_;
+ 
+@@ -63,7 +76,7 @@ sub preprocess (@) {
+        my $show=sub {
+                my $item=shift;
+                if (! $shown{$item}) {
+-                       print OUT "\"$item\" [shape=box,href=\"$mapitems{$item}\"];\n";
++                       print OUT pageescape($item)." [shape=box,href=\"$mapitems{$item}\"];\n";
+                        $shown{$item}=1;
+                }
+        };
+@@ -74,7 +87,7 @@ sub preprocess (@) {
+                        foreach my $endpoint ($item, $link) {
+                                $show->($endpoint);
+                        }
+-                       print OUT "\"$item\" -> \"$link\";\n";
++                       print OUT pageescape($item)." -> ".pageescape($link).";\n";
+                }
+        }
+        print OUT "}\n";
+-- 
+1.7.9.1

From dc2d560bba664ffe8ced3601ae342b502330b4f9 Mon Sep 17 00:00:00 2001
From: chrysn 
Date: Thu, 15 Mar 2012 10:09:00 -0400
Subject: [PATCH 165/849] linkmap issue: linked to a similar issue

---
 doc/bugs/linkmap_displays_underscore_escapes.mdwn | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/doc/bugs/linkmap_displays_underscore_escapes.mdwn b/doc/bugs/linkmap_displays_underscore_escapes.mdwn
index 6d96e463b..1539f16fe 100644
--- a/doc/bugs/linkmap_displays_underscore_escapes.mdwn
+++ b/doc/bugs/linkmap_displays_underscore_escapes.mdwn
@@ -13,6 +13,8 @@ the attached [[!taglink patch]] fixes this; from its commit message:
     because it can represent the '\"' dyad properly, and because it doesn't
     need special-casing of newlines).
 
+the output will look much better (at least in my wikis) with the "[[bugs/pagetitle function does not respect meta titles]]" issue fixed.
+
 everything below that line is the patch as produced by git-format-patch. (btw, what's the preferred way to send patches, apart from creating a git branch somewhere?)
 
 --------- snap ------------

From 4ecf1c3fb897240166a80b2366661bb0e1351008 Mon Sep 17 00:00:00 2001
From: chrysn 
Date: Thu, 15 Mar 2012 17:29:51 -0400
Subject: [PATCH 166/849] how sorting on maps might work

---
 ...arameter_for_map_plugin_and_directive.mdwn | 34 +++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn b/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn
index f6ccaf538..3b4ec73ea 100644
--- a/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn
+++ b/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn
@@ -4,4 +4,38 @@ Having a `sort=` parameter for the map plugin/directive would be real nice; like
 
 I may hack one in from `inline` if it seem within my skill level.
 
+> this could leverage the [[sorting mechanism|ikiwiki/pagespec/sorting]] already in place. as it's not sorting a flat list, there's a number of different ways to sort, which should be configurable imo.
+>
+> as an example, i'll consider pages created in the sequence c/1, a, b, c, a/1, c/2.
+>
+> sorting could:
+>
+> * sort within each level:
+>
+>   sorting order of child nodes would only matter internally in the groups
+>
+>   that would create a (a/1) b c (c/1 c/2) sequence in our example.
+>
+> * sort by maximum
+>
+>   the highest ranking page in a group would pull the parent to its own position
+>
+>   that would create b a (a/1) c (c/1 c/2).
+>
+> * sort by minimum
+>
+>   the lowest ranking page in a group would pull the parent to its own position
+>
+>   here, that would give c (c/1 c/2) a (a/1) b
+>
+> * forced sequence
+>
+>   all deepest-level items are forced to their positions, even if that means their parents are repeated at positions where they wouldn't occur naturally. parent nodes that don't have child nodes that occur directly before or after them are shown without the child nodes.
+>
+>   that'd be c (c/1) a b c a (a/1) c (c/2) in our example.
+>
+>   admittedly, the use cases for that are not too obvious, but think of a travel diary, for example, where you'd have the entries chronologically but grouped by the country you've visited. when you visit the same country twice, it should show up twice too.
+>
+> --[[chrysn]]
+
 [[!tag wishlist]]

From 13a850e71500bd0b3d760553ea01ace10af49cf7 Mon Sep 17 00:00:00 2001
From: chrysn 
Date: Thu, 15 Mar 2012 17:36:55 -0400
Subject: [PATCH 167/849] implementation suggestion for map templating

---
 doc/ikiwiki/directive/map/discussion.mdwn | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/doc/ikiwiki/directive/map/discussion.mdwn b/doc/ikiwiki/directive/map/discussion.mdwn
index b7ac17b1a..6c2e6f1c2 100644
--- a/doc/ikiwiki/directive/map/discussion.mdwn
+++ b/doc/ikiwiki/directive/map/discussion.mdwn
@@ -23,6 +23,8 @@ Is that possible?
 
 --Peter
 
+> the map directive could be made to use templates as the [[inline directive|ikiwiki/directive/inline]] does. (for the ambitious, the map functionality might even be special-cased into the inline plugin, i think) --[[chrysn]]
+
 ----
 
 The site I'm trying to set up right now (not really a wiki - no public editing) is divided into topics.  Topics are pages that have `\[[!meta link="/topic"]]`.  Topic pages contain an index of their subpages (done with `\[[!inline]]`); the subpages are the real content.  I want a map in the sidebar that lists:

From b9b4bfd29dc1b106c133402a3c4a97aeaf07fe2e Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawlqWSY9PNYRysA9vrU-JiQh7-s7q6SOcIE"
 
Date: Thu, 15 Mar 2012 18:52:13 -0400
Subject: [PATCH 168/849] Copy 'template.pm' re-write from website

---
 ...TMPL__95__LOOP_in_template_directives.mdwn | 258 ++++++++++++++++++
 1 file changed, 258 insertions(+)
 create mode 100644 doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn

diff --git a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn
new file mode 100644
index 000000000..a8d100551
--- /dev/null
+++ b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn
@@ -0,0 +1,258 @@
+[[!tag patch]]
+
+[[!templte id="note" text="""
+Simply copied this from my website
+[[http://www.camco.ie/code/ikiwiki,3.20120202,20120313a/]]
+feel free to reformat / delete"""]]
+
+The following re-write allows for multiple definitions of the
+same tag value in a template definition.  This, in turn, allows
+us to use TMPL_LOOPS in our template directives; all-be-it in a
+rather limited way.
+
+I would, personally, only use this feature for very basic loops
+and, although nested loops *might* be possible (with a little
+more tinkering) it think any attempt would be better served by
+[[Kathyrn Anderson's|http://www.katspace.org/]] [[field et
+al.|http://ikiwiki.info/plugins/contrib/field/]] plugin.
+
+It *is* (primarily) intended to allow insertion of organised CSS
+blocks (i.e. `
`) through template directives (since i can't +seem to get HTML and Markup to mix the way I want). + +[[!template id="note" text=""" +Apologies for the re-write. I struggle reading perl code that +I didn't write and (probably too often) re-format to reduce my +head-aches. Anyway it didn't make sense to post the patch since +everything's changed now. +"""]] + +# `lib/perl5/IkiWiki/Plugin/template.pm` + +[[!format perl """ + + #!/usr/bin/perl + # Structured template plugin. + package IkiWiki::Plugin::template ; + + use warnings ; + use strict ; + use IkiWiki 3.00 ; + use Encode ; + + sub mktmpl_hash( $ ; $ ; @ ) ; + # declare to supress warning in recursive call + sub mktmpl_hash( $ ; $ ; @ ) + # make hash for the template, filling + # values from the supplied params + { + my $template = shift( @_ ) + || error( "mktmpl_hash: no template provided" ) ; + my $param_src = shift( @_ ) + || error( "mktmpl_hash: no parameters" ) ; + + my $path ; + if( $#_ > 0 ) + { + $path = [ @_ ] ; + } else { + $path = shift(@_) || [] ; + } ; + + my %params ; + + my @path_vars ; + if( $#{$path} < 0 ) + { + @path_vars = $template->query() ; + } else { + @path_vars = $template->query( loop => $path ) ; + } ; + + foreach my $var ( @path_vars ) + { + push( @{$path}, $var ) ; + my $param_type = $template->query( name => $path ) ; + if( $param_type eq 'VAR' ) + { + my @var_path = split( /_/, $var ) ; + if( $var_path[0] ne '' ) + { + $path->[-1] = join( '_', @var_path[1..$#var_path] ) + if( $var_path[0] eq 'raw' ) ; + $params{$var} = shift( @{$param_src->{$path->[-1]}} ) + || return(undef) ; + } ; + } elsif( $param_type eq 'LOOP' ) + { + $params{$var} = [] ; + push( @{$params{$var}}, $_ ) + while( $_ = mktmpl_hash($template,$param_src,$path) ) ; + } ; + pop( @{$path} ) ; + } ; + return( \%params ) ; + } ; + + sub proc_tmpl_hash( $ ; $ ; $ ; $ ) ; + # declare to supress warning in recursive call + sub proc_tmpl_hash( $ ; $ ; $ ; $ ) + # walk the hash, preprocess and + # convert to html + { + my $tmpl_hash = shift( @_ ) ; + my $page = shift( @_ ) ; + my $destpage = shift( @_ ) ; + my $scan = shift( @_ ) ; + foreach my $key ( keys(%{$tmpl_hash}) ) + { + unless( ref($tmpl_hash->{$key}) ) + # here we assume that + # any reference is an + # array and allow it to + # fail if that's false + { + $tmpl_hash->{$key} = + IkiWiki::preprocess( + $page, + $destpage, + $tmpl_hash->{$key}, + $scan ) ; + my @key_path = split( /_/, $key ) ; + $tmpl_hash->{$key} = + IkiWiki::htmlize( + $page, + $destpage, + pagetype($pagesources{$page}), + $tmpl_hash->{$key}, ) + unless( $key_path[0] eq 'raw' ) ; + } else { + proc_tmpl_hash( $_, $page, $destpage, $scan ) + foreach( @{$tmpl_hash->{$key}} ) ; + } ; + } ; + } ; + + # "standard" ikiwiki definitions / hooks + + sub import + { + hook( type => "getsetup", + id => "template", + call => \&getsetup ) ; + hook( type => "preprocess", + id => "template", + call => \&preprocess, + scan => 1 ) ; + } ; + + sub getsetup() + { + return( + plugin => { + safe => 1, + rebuild => undef, + section => "widget", + }, ) ; + } ; + + sub preprocess( @ ) + { + # first process arguments into arrays of values + my %params ; + + my( $key, $value ) ; + while( ($key,$value)=splice(@_,0,2) ) + { + if( exists($params{$key}) ) + { + push( @{$params{$key}}, $value ) ; + } else { + $params{$key} = [ $value ] ; + } ; + } ; + + # set context + my $scan = ! defined( wantarray() ) ; + # This needs to run even in scan + # mode, in order to process links + # and other metadata included via + # the template. + + # check for critical values + if( ! exists($params{id}) ) + { + error( gettext("missing id parameter") ) ; + } ; + + # set some convenience variables + my $id = $params{id}->[$#{$params{id}}] ; + my $page = $params{page}->[$#{$params{page}}] ; + my $destpage = $params{destpage}->[$#{$params{destpage}}] ; + # ... and an essential one for the production pass + $params{basename} = IkiWiki::basename($page) ; + + # load the template + my $template ; + eval { + $template = + template_depends( $id, $page, + blind_cache=>1 ) ; + # The bare id is used, so + # a page templates/$id can + # be used as the template. + } ; + if( $@ ) + { + error( + sprintf( + gettext("failed to process template %s"), + htmllink( + $page, + $destpage, + "/templates/$id") + )." $@" + ) ; + } ; + + # create and process the parameters + my $tmpl_hash = mktmpl_hash( $template, \%params ) ; + proc_tmpl_hash( $tmpl_hash, $page, $destpage, $scan ) ; + # ... and load the template with the values + $template->param( $tmpl_hash ) ; + + # return the processed page chunk + return( IkiWiki::preprocess($page, + $destpage, + $template->output(),$scan) + ) ; + } ; + + 1 ; + +"""]] + +## sample template + + # + + + + + + + + +
+ +## sample iki page + + \[[!meta title="this is my loops page"]] + + \[[!template id="loops" + header0="this is a table" + data0="cell0:0" + data1="cell0:1" + data0="cell1:0" + data0="cell1:1" + ]] From bf056a7ef4d76f30eb78a7adb4cea576d5969eea Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlqWSY9PNYRysA9vrU-JiQh7-s7q6SOcIE" Date: Thu, 15 Mar 2012 18:52:49 -0400 Subject: [PATCH 169/849] --- doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn index a8d100551..1d324e2a6 100644 --- a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn +++ b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn @@ -1,6 +1,6 @@ [[!tag patch]] -[[!templte id="note" text=""" +[[!template id="note" text=""" Simply copied this from my website [[http://www.camco.ie/code/ikiwiki,3.20120202,20120313a/]] feel free to reformat / delete"""]] From ae76877625258e9f51a706c97d28fadb2402985c Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlqWSY9PNYRysA9vrU-JiQh7-s7q6SOcIE" Date: Thu, 15 Mar 2012 18:55:10 -0400 Subject: [PATCH 170/849] Note about compatibility --- doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn index 1d324e2a6..832397b0e 100644 --- a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn +++ b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn @@ -27,6 +27,8 @@ head-aches. Anyway it didn't make sense to post the patch since everything's changed now. """]] +NB: this *should* be 100% backwards compatible. + # `lib/perl5/IkiWiki/Plugin/template.pm` [[!format perl """ From a69cb46c52c003dacd47a8372d477a57ba833db8 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlqWSY9PNYRysA9vrU-JiQh7-s7q6SOcIE" Date: Thu, 15 Mar 2012 18:58:25 -0400 Subject: [PATCH 171/849] --- doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn index 832397b0e..4a9d38587 100644 --- a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn +++ b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn @@ -256,5 +256,5 @@ NB: this *should* be 100% backwards compatible. data0="cell0:0" data1="cell0:1" data0="cell1:0" - data0="cell1:1" + data1="cell1:1" ]] From c877488f5210a977886ea6487b9b90b90fe5a6f5 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlqWSY9PNYRysA9vrU-JiQh7-s7q6SOcIE" Date: Thu, 15 Mar 2012 19:00:48 -0400 Subject: [PATCH 172/849] --- doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn index 4a9d38587..fb8b7095c 100644 --- a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn +++ b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn @@ -192,7 +192,7 @@ NB: this *should* be 100% backwards compatible. my $page = $params{page}->[$#{$params{page}}] ; my $destpage = $params{destpage}->[$#{$params{destpage}}] ; # ... and an essential one for the production pass - $params{basename} = IkiWiki::basename($page) ; + $params{basename} = [ IkiWiki::basename($page) ] ; # load the template my $template ; From 02aab1da905f7a922a221b0d096cea995a7a55b1 Mon Sep 17 00:00:00 2001 From: chrysn Date: Thu, 15 Mar 2012 21:31:51 -0400 Subject: [PATCH 173/849] 2/3 solution to map plugin sorting --- .../sort_parameter_for_map_plugin_and_directive.mdwn | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn b/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn index 3b4ec73ea..0ef8be97f 100644 --- a/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn +++ b/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn @@ -38,4 +38,16 @@ I may hack one in from `inline` if it seem within my skill level. > > --[[chrysn]] +------ + +> i now do have two thirds of the solution: +> +> * i've patched the map plugin to accept a sort parameter (as usual in pagespec directives) and a strategy parameter, which is used to choose how the tree should be sorted. it turned out that the changes required were minimal; even precautions for having to display a node's parents although they are not supposed to be shown by themselves are present (they're decorated with the mapparent css class). +> * i've implemented algorithms for the described strategies, but in python -- i tried in perl, but i'm not versed well enough in perl for such things. the "force" strategy works in perl but i'm afraid it depends on more than the perl sort algorithm to be just stable. +> * if someone could port the three strategies implemented in python to perl, we'd have a complete patch for this. +> +> when comparing the implementation to my notes above, you'll see that there is a minor difference in the "force" algorithm -- my code doesn't generate the "parent" entries (**c** (c/1) a b c **a** (a/1) **c** (c/2) in the example), but they're generated by the already existing output code. +> +> the code can be found at [[incomplete_patch]] and [[python_algorithms]]. --[[chrysn]] + [[!tag wishlist]] From b1802ca42807fb044833c5f99ee9b9d3700ebd1a Mon Sep 17 00:00:00 2001 From: chrysn Date: Thu, 15 Mar 2012 21:33:11 -0400 Subject: [PATCH 174/849] the incomplete patch for the map plugin --- doc/todo/incomplete_patch.pl | 77 ++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 doc/todo/incomplete_patch.pl diff --git a/doc/todo/incomplete_patch.pl b/doc/todo/incomplete_patch.pl new file mode 100644 index 000000000..1297be663 --- /dev/null +++ b/doc/todo/incomplete_patch.pl @@ -0,0 +1,77 @@ +diff --git a/IkiWiki/Plugin/map.pm b/IkiWiki/Plugin/map.pm +index 38f090f..6b884cd 100644 +--- a/IkiWiki/Plugin/map.pm ++++ b/IkiWiki/Plugin/map.pm +@@ -25,6 +25,42 @@ sub getsetup () { + }, + } + ++sub strategy_byparents (@) { ++ # Sort by parents only ++ # ++ # With this strategy, children are sorted *under* their parents ++ # regardless of their own position, and the parents' positions are ++ # determined only by comparing the parents themselves. ++ ++ # FIXME this is *not* what's described above, but the old behavior (for ++ # testing/comparison) ++ use sort 'stable'; ++ my (@sequence,) = @_; ++ @sequence = sort @sequence; ++ return @sequence; ++} ++ ++sub strategy_forcedsequence (@) { ++ # Forced Sequence Mode ++ # ++ # Using this strategy, all entries will be shown in the sequence; this ++ # can cause parents to show up multiple times. ++ # ++ # The only reason why this is not the identical function is that ++ # parents that are sorted between their children are bubbled up to the ++ # top of their contiguous children to avoid being repeated in the ++ # output. ++ ++ use sort 'stable'; ++ ++ my (@sequence,) = @_; ++ # FIXME: i'm surprised that this actually works. i'd expect this to ++ # work with bubblesort, but i'm afraid that this may just not yield the ++ # correct results with mergesort. ++ @sequence = sort {($b eq substr($a, 0, length($b))) - ($a eq substr($b, 0, length($a)))} @sequence; ++ return @sequence; ++} ++ + sub preprocess (@) { + my %params=@_; + $params{pages}="*" unless defined $params{pages}; +@@ -37,8 +73,11 @@ sub preprocess (@) { + + # Get all the items to map. + my %mapitems; ++ my @mapsequence; + foreach my $page (pagespec_match_list($params{page}, $params{pages}, +- deptype => $deptype)) { ++ deptype => $deptype, ++ sort => exists $params{sort} ? $params{sort} : "title")) { ++ push(@mapsequence, $page); + if (exists $params{show} && + exists $pagestate{$page} && + exists $pagestate{$page}{meta}{$params{show}}) { +@@ -88,7 +127,15 @@ sub preprocess (@) { + $map .= "
    \n"; + } + +- foreach my $item (sort keys %mapitems) { ++ if (!exists $params{strategy} || $params{strategy} eq "parent") { ++ @mapsequence = strategy_byparents(@mapsequence); ++ } elsif ($params{strategy} eq "forced") { ++ @mapsequence = strategy_forcedsequence(@mapsequence); ++ } else { ++ error("Unknown strategy."); ++ } ++ ++ foreach my $item (@mapsequence) { + my @linktext = (length $mapitems{$item} ? (linktext => $mapitems{$item}) : ()); + $item=~s/^\Q$common_prefix\E\/// + if defined $common_prefix && length $common_prefix; From 3ca2d6f45900edf36162c0a1269654095cae7914 Mon Sep 17 00:00:00 2001 From: chrysn Date: Thu, 15 Mar 2012 21:34:12 -0400 Subject: [PATCH 175/849] rename todo/incomplete_patch.pl to todo/sort_parameter_for_map_plugin_and_directive/incomplete_patch.pl.pl --- .../incomplete_patch.pl.pl} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/todo/{incomplete_patch.pl => sort_parameter_for_map_plugin_and_directive/incomplete_patch.pl.pl} (100%) diff --git a/doc/todo/incomplete_patch.pl b/doc/todo/sort_parameter_for_map_plugin_and_directive/incomplete_patch.pl.pl similarity index 100% rename from doc/todo/incomplete_patch.pl rename to doc/todo/sort_parameter_for_map_plugin_and_directive/incomplete_patch.pl.pl From 128234cde1ed0504d6beb0b2d10544feb2d77809 Mon Sep 17 00:00:00 2001 From: chrysn Date: Thu, 15 Mar 2012 21:36:36 -0400 Subject: [PATCH 176/849] the algorithms required for map plugin sorting --- .../python_algorithms.py | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 doc/todo/sort_parameter_for_map_plugin_and_directive/python_algorithms.py diff --git a/doc/todo/sort_parameter_for_map_plugin_and_directive/python_algorithms.py b/doc/todo/sort_parameter_for_map_plugin_and_directive/python_algorithms.py new file mode 100644 index 000000000..ccee8185d --- /dev/null +++ b/doc/todo/sort_parameter_for_map_plugin_and_directive/python_algorithms.py @@ -0,0 +1,81 @@ +testdata = "c/3 a b d b/1 c/1 c/2/x c/2 c".split(" ") + +def strategy_byearlychild(sequence): + """Sort by earliest child + + When this strategy is used, a parent is displayed with all its children as + soon as the first child is supposed to be shown. + + >>> strategy_byearlychild(testdata) + ['c', 'c/3', 'c/1', 'c/2', 'c/2/x', 'a', 'b', 'b/1', 'd'] + """ + + # first step: pull parents to top + def firstchildindex(item): + childindices = [i for (i,text) in enumerate(sequence) if text.startswith(item + "/")] + # distinction required as min(foo, *[]) tries to iterate over foo + if childindices: + return min(sequence.index(item), *childindices) + else: + return sequence.index(item) + sequence = sorted(sequence, key=firstchildindex) + + # second step: pull other children to the start too + return strategy_byparents(sequence) + +def strategy_byparents(sequence): + """Sort by parents only + + With this strategy, children are sorted *under* their parents regardless of + their own position, and the parents' positions are determined only by + comparing the parents themselves. + + >>> strategy_byparents(testdata) + ['a', 'b', 'b/1', 'd', 'c', 'c/3', 'c/1', 'c/2', 'c/2/x'] + """ + + def partindices(item): + return tuple(sequence.index(item.rsplit('/', i)[0]) for i in range(item.count('/'), -1, -1)) + + return sorted(sequence, key=partindices) + +def strategy_forcedsequence(sequence): + """Forced Sequence Mode + + Using this strategy, all entries will be shown in the sequence; this can + cause parents to show up multiple times. + + The only reason why this is not the identical function is that parents that + are sorted between their children are bubbled up to the top of their + contiguous children to avoid being repeated in the output. + + >>> strategy_forcedsequence(testdata) + ['c/3', 'a', 'b', 'd', 'b/1', 'c', 'c/1', 'c/2', 'c/2/x'] + """ + + # this is a classical bubblesort. other algorithms wouldn't work because + # they'd compare non-adjacent entries and move the parents before remote + # children. python's timsort seems to work too... + + for i in range(len(sequence), 1, -1): + for j in range(1, i): + if sequence[j-1].startswith(sequence[j] + '/'): + sequence[j-1:j+1] = [sequence[j], sequence[j-1]] + + return sequence + +def strategy_forcedsequence_timsort(sequence): + sequence.sort(lambda x,y: -1 if y.startswith(x) else 1) + return sequence + +if __name__ == "__main__": + import doctest + doctest.testmod() + + import itertools + + for perm in itertools.permutations(testdata): + if strategy_forcedsequence(testdata[:]) != strategy_forcedsequence_timsort(testdata[:]): + print "difference for testdata", testdata + print "normal", strategy_forcedsequence(testdata[:]) + print "timsort", strategy_forcedsequence_timsort(testdata[:]) From cc3afb84505657d014dd6f805aefee4a9a9cadb5 Mon Sep 17 00:00:00 2001 From: chrysn Date: Thu, 15 Mar 2012 21:38:59 -0400 Subject: [PATCH 177/849] (fixed links that were broken due to missing extensions) --- doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn b/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn index 0ef8be97f..b07ea33f1 100644 --- a/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn +++ b/doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn @@ -48,6 +48,6 @@ I may hack one in from `inline` if it seem within my skill level. > > when comparing the implementation to my notes above, you'll see that there is a minor difference in the "force" algorithm -- my code doesn't generate the "parent" entries (**c** (c/1) a b c **a** (a/1) **c** (c/2) in the example), but they're generated by the already existing output code. > -> the code can be found at [[incomplete_patch]] and [[python_algorithms]]. --[[chrysn]] +> the code can be found at [[incomplete_patch.pl.pl]] and [[python_algorithms.py]]. --[[chrysn]] [[!tag wishlist]] From f6af518364209acf628d2b948b4ced7cc3dd8e71 Mon Sep 17 00:00:00 2001 From: "http://joey.kitenet.net/" Date: Fri, 16 Mar 2012 16:33:20 -0400 Subject: [PATCH 178/849] Added a comment --- ...comment_3_d62173d0ae220ab7b063631952856587._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_3_d62173d0ae220ab7b063631952856587._comment diff --git a/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_3_d62173d0ae220ab7b063631952856587._comment b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_3_d62173d0ae220ab7b063631952856587._comment new file mode 100644 index 000000000..8dc2f9851 --- /dev/null +++ b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_3_d62173d0ae220ab7b063631952856587._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2012-03-16T20:33:20Z" + content=""" +The locale settings look ok. + +I'd try upgrading your perl. 5.12.3 is rather old, and the code that is failing is part of perl. +"""]] From 4fee7097cd4c2ddb600640eb9266ea5f561a8fa2 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 17 Mar 2012 14:04:23 -0400 Subject: [PATCH 179/849] improve docs --- doc/ikiwiki/directive/meta.mdwn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/ikiwiki/directive/meta.mdwn b/doc/ikiwiki/directive/meta.mdwn index 72cfc6f56..f8494dbff 100644 --- a/doc/ikiwiki/directive/meta.mdwn +++ b/doc/ikiwiki/directive/meta.mdwn @@ -133,8 +133,8 @@ Supported fields: \[[!meta redir=otherpage]] - Optionally, a delay (in seconds) can be specified. The default is to - redirect without delay. + The default is to redirect without delay. + Optionally, a delay (in seconds) can be specified: "delay=10" It can also be used to redirect to an external url. For example: From 8cad848af3226e91ff4796f56292beca32447645 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlqWSY9PNYRysA9vrU-JiQh7-s7q6SOcIE" Date: Sat, 17 Mar 2012 16:57:43 -0400 Subject: [PATCH 180/849] --- doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn index fb8b7095c..1aafb173b 100644 --- a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn +++ b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn @@ -1,4 +1,4 @@ -[[!tag patch]] +[[!tag patch todo]] [[!template id="note" text=""" Simply copied this from my website From dc3b9934d5660a085d9b5e041b7e8749493b9360 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sun, 18 Mar 2012 17:01:45 +0000 Subject: [PATCH 181/849] Move trail out of the contrib directory in preparation for eventual merge --- .../ikiwiki/directive/trailinline.mdwn | 2 +- .../ikiwiki/directive/trailitem.mdwn | 2 +- .../ikiwiki/directive/trailitems.mdwn | 2 +- .../ikiwiki/directive/traillink.mdwn | 2 +- .../ikiwiki/directive/trailoptions.mdwn | 2 +- doc/plugins/{contrib => }/trail.mdwn | 57 ------------------- 6 files changed, 5 insertions(+), 62 deletions(-) rename doc/{plugins/contrib => }/ikiwiki/directive/trailinline.mdwn (90%) rename doc/{plugins/contrib => }/ikiwiki/directive/trailitem.mdwn (75%) rename doc/{plugins/contrib => }/ikiwiki/directive/trailitems.mdwn (92%) rename doc/{plugins/contrib => }/ikiwiki/directive/traillink.mdwn (93%) rename doc/{plugins/contrib => }/ikiwiki/directive/trailoptions.mdwn (88%) rename doc/plugins/{contrib => }/trail.mdwn (54%) diff --git a/doc/plugins/contrib/ikiwiki/directive/trailinline.mdwn b/doc/ikiwiki/directive/trailinline.mdwn similarity index 90% rename from doc/plugins/contrib/ikiwiki/directive/trailinline.mdwn rename to doc/ikiwiki/directive/trailinline.mdwn index 91d8a4edf..e32fb34d0 100644 --- a/doc/plugins/contrib/ikiwiki/directive/trailinline.mdwn +++ b/doc/ikiwiki/directive/trailinline.mdwn @@ -1,5 +1,5 @@ The `trailinline` directive is provided by the -[[!iki plugins/contrib/trail desc=trail]] +[[!iki plugins/trail desc=trail]] plugin. It is equivalent to combining [[ikiwiki/directive/trailitems]] and [[ikiwiki/directive/inline]] directives with the same options. diff --git a/doc/plugins/contrib/ikiwiki/directive/trailitem.mdwn b/doc/ikiwiki/directive/trailitem.mdwn similarity index 75% rename from doc/plugins/contrib/ikiwiki/directive/trailitem.mdwn rename to doc/ikiwiki/directive/trailitem.mdwn index 73b1985a5..59626b5a1 100644 --- a/doc/plugins/contrib/ikiwiki/directive/trailitem.mdwn +++ b/doc/ikiwiki/directive/trailitem.mdwn @@ -1,5 +1,5 @@ The `trailitem` directive is supplied by the -[[!iki plugins/contrib/trail desc=trail]] plugin. It is used like this: +[[!iki plugins/trail desc=trail]] plugin. It is used like this: \[[!trailitem some_other_page]] diff --git a/doc/plugins/contrib/ikiwiki/directive/trailitems.mdwn b/doc/ikiwiki/directive/trailitems.mdwn similarity index 92% rename from doc/plugins/contrib/ikiwiki/directive/trailitems.mdwn rename to doc/ikiwiki/directive/trailitems.mdwn index 4106ed33b..b1ba8d356 100644 --- a/doc/plugins/contrib/ikiwiki/directive/trailitems.mdwn +++ b/doc/ikiwiki/directive/trailitems.mdwn @@ -1,5 +1,5 @@ The `trailitems` directive is supplied by the -[[!iki plugins/contrib/trail desc=trail]] plugin. It adds pages +[[!iki plugins/trail desc=trail]] plugin. It adds pages to the trail represented by the current page, without producing any output on that page. diff --git a/doc/plugins/contrib/ikiwiki/directive/traillink.mdwn b/doc/ikiwiki/directive/traillink.mdwn similarity index 93% rename from doc/plugins/contrib/ikiwiki/directive/traillink.mdwn rename to doc/ikiwiki/directive/traillink.mdwn index 0e40e2411..090e2538d 100644 --- a/doc/plugins/contrib/ikiwiki/directive/traillink.mdwn +++ b/doc/ikiwiki/directive/traillink.mdwn @@ -1,5 +1,5 @@ The `traillink` directive is supplied by the -[[!iki plugins/contrib/trail desc=trail]] +[[!iki plugins/trail desc=trail]] plugin. It generates a visible [[ikiwiki/WikiLink]], and also adds the linked page to the trail represented by the page containing the directive. diff --git a/doc/plugins/contrib/ikiwiki/directive/trailoptions.mdwn b/doc/ikiwiki/directive/trailoptions.mdwn similarity index 88% rename from doc/plugins/contrib/ikiwiki/directive/trailoptions.mdwn rename to doc/ikiwiki/directive/trailoptions.mdwn index e1603f11b..d83f444c0 100644 --- a/doc/plugins/contrib/ikiwiki/directive/trailoptions.mdwn +++ b/doc/ikiwiki/directive/trailoptions.mdwn @@ -1,5 +1,5 @@ The `trailoptions` directive is supplied by the -[[!iki plugins/contrib/trail desc=trail]] plugin. It sets options for the +[[!iki plugins/trail desc=trail]] plugin. It sets options for the trail represented by this page. \[[!trailoptions sort="meta(title)" circular="no"]] diff --git a/doc/plugins/contrib/trail.mdwn b/doc/plugins/trail.mdwn similarity index 54% rename from doc/plugins/contrib/trail.mdwn rename to doc/plugins/trail.mdwn index bfd4d3d0b..406d40246 100644 --- a/doc/plugins/contrib/trail.mdwn +++ b/doc/plugins/trail.mdwn @@ -1,60 +1,3 @@ -[[!tag patch]] -[[!template id=gitbranch branch=smcv/trail3 author="[[smcv]]"]] - -Available from [[smcv]]'s git repository, in the `trail3` branch. This -plugin aims to solve [[todo/wikitrails]] in a simpler way; it can also be -used for [[navigation through blog posts|todo/Pagination_next_prev_links]]. - -If you don't want to use a branch of ikiwiki, manual installation requires -these files (use the "raw" link in gitweb to download): - -* [trail.pm](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/IkiWiki/Plugin/trail.pm) - in an `IkiWiki/Plugin` subdirectory of your configured `plugindir` -* [page.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/templates/page.tmpl) - and - [trails.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/templates/trails.tmpl) - in your configured `templatedir`, or a `templates` subdirectory of your wiki repository -* the trail-related bits from the end of the - [stylesheet](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/doc/style.css) - (put them in your local.css) -* the trail-related bits at the end of the - [actiontabs](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/themes/actiontabs/style.css) - or [blueview/goldtype](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/themes/blueview/style.css) - stylesheets, if you use one of those themes (again, put them in your local.css) - -The branch also includes [[todo/test_coverage]] machinery. - -Demo: - -* [in use on entries in my blog](http://smcv.pseudorandom.co.uk/) -* [a demo trail based on links](http://demo.hosted.pseudorandom.co.uk/trail/) -* [a demo hybrid trail/inline](http://demo.hosted.pseudorandom.co.uk/trail2/) - -The page `e` is in both demo trails, to demonstrate how a page in more than -one trail looks. - -The `smcv/trail2` branch is an older version of `trail3` which used typed links -as its data structure, resulting in timing-related limitations (it couldn't -select pages for the trail by using pagespecs, because pagespecs can't be -evaluated correctly until the scan stage has finished). - -Updated, November 2011: - -* reinstated `inline` integration ([[report]] integration would probably be - pretty easy too, if this gets merged) -* switched from typed links back to a custom data structure to avoid - chicken/egg problems with ordering -* create typed links too, as a side-effect, but not when using an inline -* regression test with nearly full coverage -* CSS for the default anti-theme and all built-in themes (it looks nicest - in the default anti-theme and in actiontabs - the demo uses actiontabs) - -Known bugs: - -* the blueview and goldtype CSS nearly work, but the alignment is a bit off - ----- - [[!template id=plugin name=trail author="[[Simon_McVittie|smcv]]"]] [[!tag type/chrome]] From 63bb8b42f76e350cdf7a1256ad0fe7ad63199f63 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sun, 18 Mar 2012 17:11:05 +0000 Subject: [PATCH 182/849] Replace [[!trailinline]] directive with [[!inline trail=yes]] --- IkiWiki/Plugin/inline.pm | 19 ++++++++++++++++++- IkiWiki/Plugin/trail.pm | 26 +------------------------- doc/examples/blog/posts.mdwn | 2 +- doc/ikiwiki/directive/inline.mdwn | 5 +++++ doc/ikiwiki/directive/trailinline.mdwn | 11 ----------- doc/plugins/trail.mdwn | 18 +++++++++--------- t/trail.t | 6 +++--- 7 files changed, 37 insertions(+), 50 deletions(-) delete mode 100644 doc/ikiwiki/directive/trailinline.mdwn diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm index 159cc5def..3dc410c27 100644 --- a/IkiWiki/Plugin/inline.pm +++ b/IkiWiki/Plugin/inline.pm @@ -19,7 +19,7 @@ sub import { hook(type => "checkconfig", id => "inline", call => \&checkconfig); hook(type => "sessioncgi", id => "inline", call => \&sessioncgi); hook(type => "preprocess", id => "inline", - call => \&IkiWiki::preprocess_inline); + call => \&IkiWiki::preprocess_inline, scan => 1); hook(type => "pagetemplate", id => "inline", call => \&IkiWiki::pagetemplate_inline); hook(type => "format", id => "inline", call => \&format, first => 1); @@ -155,6 +155,23 @@ sub preprocess_inline (@) { if (! exists $params{pages} && ! exists $params{pagenames}) { error gettext("missing pages parameter"); } + + if (! defined wantarray) { + # Running in scan mode: only do the essentials + + if (yesno($params{trail}) && IkiWiki::Plugin::trail->can("preprocess_trailitems")) { + # default to sorting age, the same as inline itself, + # but let the params override that + IkiWiki::Plugin::trail::preprocess_trailitems(sort => 'age', %params); + } + + return; + } + + if (yesno($params{trail}) && IkiWiki::Plugin::trail->can("preprocess_trailitems")) { + scalar IkiWiki::Plugin::trail::preprocess_trailitems(sort => 'age', %params); + } + my $raw=yesno($params{raw}); my $archive=yesno($params{archive}); my $rss=(($config{rss} || $config{allowrss}) && exists $params{rss}) ? yesno($params{rss}) : $config{rss}; diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index 5ee152155..4f309ea2e 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -1,6 +1,6 @@ #!/usr/bin/perl # Copyright © 2008-2011 Joey Hess -# Copyright © 2009-2011 Simon McVittie +# Copyright © 2009-2012 Simon McVittie # Licensed under the GNU GPL, version 2, or any later version published by the # Free Software Foundation package IkiWiki::Plugin::trail; @@ -13,7 +13,6 @@ sub import { hook(type => "getsetup", id => "trail", call => \&getsetup); hook(type => "needsbuild", id => "trail", call => \&needsbuild); hook(type => "preprocess", id => "trailoptions", call => \&preprocess_trailoptions, scan => 1); - hook(type => "preprocess", id => "trailinline", call => \&preprocess_trailinline, scan => 1); hook(type => "preprocess", id => "trailitem", call => \&preprocess_trailitem, scan => 1); hook(type => "preprocess", id => "trailitems", call => \&preprocess_trailitems, scan => 1); hook(type => "preprocess", id => "traillink", call => \&preprocess_traillink, scan => 1); @@ -123,29 +122,6 @@ sub preprocess_trailoptions (@) { return ""; } -sub preprocess_trailinline (@) { - my %params = @_; - - if (! exists $params{sort}) { - # sort in the same order as [[plugins/inline]]'s default - $params{sort} = 'age'; - } - - if (defined wantarray) { - scalar preprocess_trailitems(%params); - - if (IkiWiki->can("preprocess_inline")) { - return IkiWiki::preprocess_inline(@_); - } - else { - error("trailinline directive requires the inline plugin"); - } - } - else { - preprocess_trailitems(%params); - } -} - sub preprocess_trailitem (@) { my $link = shift; shift; diff --git a/doc/examples/blog/posts.mdwn b/doc/examples/blog/posts.mdwn index 6e9a3f001..2bd0f1d6f 100644 --- a/doc/examples/blog/posts.mdwn +++ b/doc/examples/blog/posts.mdwn @@ -1,3 +1,3 @@ Here is a full list of posts to the [[blog|index]]. -[[!trailinline pages="page(./posts/*) and !*/Discussion" archive=yes feedshow=10 quick=yes]] +[[!inline pages="page(./posts/*) and !*/Discussion" archive=yes feedshow=10 quick=yes trail=yes]] diff --git a/doc/ikiwiki/directive/inline.mdwn b/doc/ikiwiki/directive/inline.mdwn index 22c18d9a1..4b11e5997 100644 --- a/doc/ikiwiki/directive/inline.mdwn +++ b/doc/ikiwiki/directive/inline.mdwn @@ -117,5 +117,10 @@ Here are some less often needed parameters: [[SubPage/LinkingRules]] as in a [[ikiwiki/WikiLink]]), and they are inlined in exactly the order given: the `sort` and `pages` parameters cannot be used in conjunction with this one. +* `trail` - If the [[!iki plugins/trail desc=trail]] plugin is enabled, turn + the inlined pages into a trail with next/previous links, by passing the same + options to [[ikiwiki/directive/trailitems]]. The `skip` and `show` options + are ignored by the trail, so the next/previous links traverse through + all matching pages. [[!meta robots="noindex, follow"]] diff --git a/doc/ikiwiki/directive/trailinline.mdwn b/doc/ikiwiki/directive/trailinline.mdwn deleted file mode 100644 index e32fb34d0..000000000 --- a/doc/ikiwiki/directive/trailinline.mdwn +++ /dev/null @@ -1,11 +0,0 @@ -The `trailinline` directive is provided by the -[[!iki plugins/trail desc=trail]] -plugin. It is equivalent to combining [[ikiwiki/directive/trailitems]] and -[[ikiwiki/directive/inline]] directives with the same options. - -A typical use is to navigate through all posts in a blog: - - \[[!trailinline pages="page(./posts/*) and !*/Discussion" archive=yes - feedshow=10 quick=yes]] - -[[!meta robots="noindex, follow"]] diff --git a/doc/plugins/trail.mdwn b/doc/plugins/trail.mdwn index 406d40246..14b97e35a 100644 --- a/doc/plugins/trail.mdwn +++ b/doc/plugins/trail.mdwn @@ -3,8 +3,7 @@ This plugin provides the [[ikiwiki/directive/trailoptions]], [[ikiwiki/directive/traillink]], [[ikiwiki/directive/trailitem]], -[[ikiwiki/directive/trailitems]] -and [[ikiwiki/directive/trailinline]] [[directives|ikiwiki/directive]]. +and [[ikiwiki/directive/trailitems]] [[directives|ikiwiki/directive]]. It's sometimes useful to have "trails" of pages in a wiki where each page links to the next and/or previous page. For instance, you could use @@ -24,15 +23,16 @@ entire trail. Pages can be included in a trail in various ways: -* The [[ikiwiki/directive/trailinline]] directive sets up an [[inline]], - and at the same time adds the matching pages (from `pages` or `pagenames`) - to the trail. One use is to navigate through all posts in a blog: +* The [[ikiwiki/directive/inline]] directive with `trail="yes"` sets up an + [[inline]], and at the same time adds the matching pages (from `pages` or + `pagenames`) to the trail. One use is to navigate through all posts in + a blog: - \[[!trailinline pages="page(./posts/*) and !*/Discussion" archive=yes - feedshow=10 quick=yes]] + \[[!inline pages="page(./posts/*) and !*/Discussion" archive=yes + feedshow=10 quick=yes trail=yes]] - This directive only works if the [[!iki plugins/inline desc=inline]] - plugin is also enabled. + This only works if the trail and [[!iki plugins/inline desc=inline]] + plugins are both enabled. * The [[ikiwiki/directive/trailitems]] directive has optional `pages` and `pagenames` options which behave the same as in [[inline]], but don't diff --git a/t/trail.t b/t/trail.t index 0cf50ddc1..17fe54310 100755 --- a/t/trail.t +++ b/t/trail.t @@ -60,13 +60,13 @@ ok(utime(333333333, 333333333, "t/tmp/in/sorting/new.mdwn")); ok(utime(222222222, 222222222, "t/tmp/in/sorting/old.mdwn")); ok(utime(111111111, 111111111, "t/tmp/in/sorting/ancient.mdwn")); writefile("sorting/linked2.mdwn", "t/tmp/in", "linked2"); -# This initially uses the default sort order: age for trailinline, and path -# for trail. We change it later. +# This initially uses the default sort order: age for the inline, and path +# for trailitems. We change it later. writefile("sorting.mdwn", "t/tmp/in", '[[!traillink linked]] ' . '[[!trailitems pages="sorting/z/a or sorting/a/b or sorting/a/c"]] ' . '[[!trailitems pagenames="beginning middle end"]] ' . - '[[!trailinline pages="sorting/old or sorting/ancient or sorting/new"]] ' . + '[[!inline pages="sorting/old or sorting/ancient or sorting/new" trail="yes"]] ' . '[[!traillink linked2]]'); writefile("meme.mdwn", "t/tmp/in", < Date: Sun, 18 Mar 2012 17:34:39 +0000 Subject: [PATCH 183/849] Add a build_affected hook so trail doesn't have to inject In principle, building any pages affected by links, backlinks etc. could work the same way. --- IkiWiki/Plugin/trail.pm | 18 +++++------------- IkiWiki/Render.pm | 8 ++++++++ doc/plugins/write.mdwn | 16 ++++++++++++++++ 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index 4f309ea2e..29830175e 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -17,6 +17,7 @@ sub import { hook(type => "preprocess", id => "trailitems", call => \&preprocess_trailitems, scan => 1); hook(type => "preprocess", id => "traillink", call => \&preprocess_traillink, scan => 1); hook(type => "pagetemplate", id => "trail", call => \&pagetemplate); + hook(type => "build_affected", id => "trail", call => \&build_affected); } =head1 Page state @@ -275,14 +276,9 @@ sub trails_differ { my $done_prerender = 0; -my %origsubs; - sub prerender { return if $done_prerender; - $origsubs{render_backlinks} = \&IkiWiki::render_backlinks; - inject(name => "IkiWiki::render_backlinks", call => \&render_backlinks); - %trail_to_members = (); %member_to_trails = (); @@ -368,18 +364,14 @@ sub prerender { $done_prerender = 1; } -# This is called at about the right time that we can hijack it to render -# extra pages. -sub render_backlinks ($) { - my $blc = shift; +sub build_affected { + my %affected; foreach my $member (keys %rebuild_trail_members) { - next unless exists $pagesources{$member}; - - IkiWiki::render($pagesources{$member}, sprintf(gettext("building %s, its previous or next page has changed"), $member)); + $affected{$member} = sprintf(gettext("building %s, its previous or next page has changed"), $member); } - $origsubs{render_backlinks}($blc); + return %affected; } sub title_of ($) { diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index 05132a8a8..adb39a983 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -800,6 +800,14 @@ sub refresh () { derender_internal($file); } + run_hooks(build_affected => sub { + my %affected = shift->(); + while (my ($page, $message) = each %affected) { + next unless exists $pagesources{$page}; + render($pagesources{$page}, $message); + } + }); + my ($backlinkchanged, $linkchangers)=calculate_changed_links($changed, $del, $oldlink_targets); diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index dcab041dc..d62ab6e63 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -356,6 +356,22 @@ when the page is being previewed.) The function is passed named parameters: "page" and "content", and should return the formatted content. +### build_affected + + hook(type => "build_affected", id => "foo", call => \&build_affected); + +This hook is called after the directly changed pages have been built, +and can cause extra pages to be built. If links and backlinks were provided +by a plugin, this would be where that plugin would rebuild pages whose +backlinks have changed, for instance. The [[trail]] plugin uses this hook +to rebuild pages whose next or previous page has changed. + +The function should currently ignore its parameters. It returns a list with +an even number of items (a hash in list context), where the first item of +each pair is a page name to be rebuilt (if it was not already rebuilt), and +the second is a log message resembling +`building plugins/write because the phase of the moon has changed`. + ### delete hook(type => "delete", id => "foo", call => \&delete); From 8fccf62f9297a7ae5df4fb020b583593517c9b0f Mon Sep 17 00:00:00 2001 From: "http://smcv.pseudorandom.co.uk/" Date: Sun, 18 Mar 2012 13:58:29 -0400 Subject: [PATCH 184/849] updated, again --- doc/plugins/contrib/trail.mdwn | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/doc/plugins/contrib/trail.mdwn b/doc/plugins/contrib/trail.mdwn index bfd4d3d0b..9d895783a 100644 --- a/doc/plugins/contrib/trail.mdwn +++ b/doc/plugins/contrib/trail.mdwn @@ -1,7 +1,7 @@ [[!tag patch]] -[[!template id=gitbranch branch=smcv/trail3 author="[[smcv]]"]] +[[!template id=gitbranch branch=smcv/trail3-integrated author="[[smcv]]"]] -Available from [[smcv]]'s git repository, in the `trail3` branch. This +Available from [[smcv]]'s git repository, in the `trail3` and `trail3-integrated` branches. This plugin aims to solve [[todo/wikitrails]] in a simpler way; it can also be used for [[navigation through blog posts|todo/Pagination_next_prev_links]]. @@ -38,7 +38,7 @@ as its data structure, resulting in timing-related limitations (it couldn't select pages for the trail by using pagespecs, because pagespecs can't be evaluated correctly until the scan stage has finished). -Updated, November 2011: +Updated, November 2011 (`trail3`): * reinstated `inline` integration ([[report]] integration would probably be pretty easy too, if this gets merged) @@ -49,6 +49,12 @@ Updated, November 2011: * CSS for the default anti-theme and all built-in themes (it looks nicest in the default anti-theme and in actiontabs - the demo uses actiontabs) +Updated, March 2012 (`trail3-integrated`): + +* replaced `\[[!trailinline]]` with `\[[!inline trail=yes]]` +* added a `build_affected` hook so it doesn't have to use `inject` + (optional commit, can be omitted) + Known bugs: * the blueview and goldtype CSS nearly work, but the alignment is a bit off From 069e45fc003e2e71b1e245a136d21277e1b3c4b7 Mon Sep 17 00:00:00 2001 From: "http://smcv.pseudorandom.co.uk/" Date: Sun, 18 Mar 2012 14:19:11 -0400 Subject: [PATCH 185/849] request for re-review --- doc/plugins/contrib/trail/discussion.mdwn | 39 +++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 doc/plugins/contrib/trail/discussion.mdwn diff --git a/doc/plugins/contrib/trail/discussion.mdwn b/doc/plugins/contrib/trail/discussion.mdwn new file mode 100644 index 000000000..d539919eb --- /dev/null +++ b/doc/plugins/contrib/trail/discussion.mdwn @@ -0,0 +1,39 @@ +I believe the `trail3-integrated` and `trail3-prebuild` branches address +Joey's review comments from IRC: + +> 06-12-2011 19:01:07 : ok, light review finished. so, if you want +> to make a branch with inline trail=yes, and perhaps also adding a hook +> so you don't need to inject, I think I can merge it right away + +I haven't published instructions for using this version as a +standalone plugin, because it needs core and inline changes. + +Commits up to 63bb8b42 make the trail plugin better-integrated, +including `\[[!inline trail=yes]]`. 63bb8b42 is the commit to +merge if you don't like the design of my hooks. + +Commit 24168b99 adds a `build_affected` hook, run at about the +same time as `render_backlinks`, and uses it to render the +extra pages. This removes the need for `trail` to inject +anything. In principle, backlinks etc. could use this hook +too, if they weren't core. + +Commit d0dea308 on the `trail3-prebuild` branch adds a +`prebuild` hook, which runs after everything has been scanned +but before anything is rendered. This removes the need +for `trail` to run its old `prerender` function in its +render hooks (preprocess, pagetemplate etc.) to collate +metadata before it renders anything. However, I'm not sure +that this is really the right thing to do, which is why it's +in its own branch: the `prebuild` hook is a lot like +`needsbuild` (but later), so it's called even if no trail +or trail member has actually been edited. + +For it to be useful for `trail`, the `prebuild` hook has to run +after both pagespecs and sorting work. The other use case +I've seen for a similar hook was for Guiseppe Bilotta to +sort an inline-of-inlines by mtime of newest post, but that +can't be the same hook, because it has to run after pagespecs +work, but before sorting. + +--[[smcv]] From de00470dcf79f0163b9b0c9a0f4ca39cf9ba9427 Mon Sep 17 00:00:00 2001 From: "http://smcv.pseudorandom.co.uk/" Date: Sun, 18 Mar 2012 14:21:11 -0400 Subject: [PATCH 186/849] formatting --- doc/plugins/contrib/trail/discussion.mdwn | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/plugins/contrib/trail/discussion.mdwn b/doc/plugins/contrib/trail/discussion.mdwn index d539919eb..d00b5589a 100644 --- a/doc/plugins/contrib/trail/discussion.mdwn +++ b/doc/plugins/contrib/trail/discussion.mdwn @@ -1,9 +1,9 @@ I believe the `trail3-integrated` and `trail3-prebuild` branches address Joey's review comments from IRC: -> 06-12-2011 19:01:07 : ok, light review finished. so, if you want -> to make a branch with inline trail=yes, and perhaps also adding a hook -> so you don't need to inject, I think I can merge it right away + 06-12-2011 19:01:07 : ok, light review finished. so, if you want + to make a branch with inline trail=yes, and perhaps also adding a hook + so you don't need to inject, I think I can merge it right away I haven't published instructions for using this version as a standalone plugin, because it needs core and inline changes. From a2eee93787bc602284a6b64f0d26ae2296a492d2 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 14:23:47 -0400 Subject: [PATCH 187/849] move --- doc/plugins/{contrib => }/trail/discussion.mdwn | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/plugins/{contrib => }/trail/discussion.mdwn (100%) diff --git a/doc/plugins/contrib/trail/discussion.mdwn b/doc/plugins/trail/discussion.mdwn similarity index 100% rename from doc/plugins/contrib/trail/discussion.mdwn rename to doc/plugins/trail/discussion.mdwn From 9c30a00b24f38421732b23b4223c389ee697796e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 14:30:54 -0400 Subject: [PATCH 188/849] merged trail3-integrated --- doc/plugins/trail/discussion.mdwn | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/plugins/trail/discussion.mdwn b/doc/plugins/trail/discussion.mdwn index d00b5589a..8b3981f0c 100644 --- a/doc/plugins/trail/discussion.mdwn +++ b/doc/plugins/trail/discussion.mdwn @@ -37,3 +37,7 @@ can't be the same hook, because it has to run after pagespecs work, but before sorting. --[[smcv]] + +> I've merged trail3-integrated, but not prebuild. I don't exactly dislike +> prebuild, but dunno that the hook prolieration is worth the minor cleanup +> it allows in trail. --[[Joey]] From d134a2a6e93bbb26664b027a10d98ac996a63cfc Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 14:34:21 -0400 Subject: [PATCH 189/849] avoid unnecessary uses of UNIVERSAL Foo->Bar->can("method") works just as well, even if Foo::Bar is not loaded. Using UNIVERSAL::can is deprecated. But, I was unable to easily eliminate conditional.pm's use of UNIVERSAL::can --- IkiWiki/Plugin/attachment.pm | 2 +- IkiWiki/Plugin/conditional.pm | 1 - IkiWiki/Plugin/po.pm | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/IkiWiki/Plugin/attachment.pm b/IkiWiki/Plugin/attachment.pm index 5a180cd5c..133a54daf 100644 --- a/IkiWiki/Plugin/attachment.pm +++ b/IkiWiki/Plugin/attachment.pm @@ -148,7 +148,7 @@ sub formbuilder (@) { $f=Encode::decode_utf8($f); $f=~s/^$page\///; if (IkiWiki::isinlinableimage($f) && - UNIVERSAL::can("IkiWiki::Plugin::img", "import")) { + IkiWiki::Plugin::img->can("import")) { $add.='[[!img '.$f.' align="right" size="" alt=""]]'; } else { diff --git a/IkiWiki/Plugin/conditional.pm b/IkiWiki/Plugin/conditional.pm index 026078b3c..0a3d7fb4c 100644 --- a/IkiWiki/Plugin/conditional.pm +++ b/IkiWiki/Plugin/conditional.pm @@ -4,7 +4,6 @@ package IkiWiki::Plugin::conditional; use warnings; use strict; use IkiWiki 3.00; -use UNIVERSAL; sub import { hook(type => "getsetup", id => "conditional", call => \&getsetup); diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 6410a1c66..287b5aa11 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -23,7 +23,6 @@ use File::Copy; use File::Spec; use File::Temp; use Memoize; -use UNIVERSAL; my ($master_language_code, $master_language_name); my %translations; From 223c6d487ae05e50998f2cd50997befa5eafb321 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 14:38:20 -0400 Subject: [PATCH 190/849] more updates for trail merge --- debian/changelog | 1 + debian/copyright | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/debian/changelog b/debian/changelog index 3bc2a7e29..789a0b967 100644 --- a/debian/changelog +++ b/debian/changelog @@ -17,6 +17,7 @@ ikiwiki (3.20120203) UNRELEASED; urgency=low Previous links. Trails can easily be added to existing inlines by setting trail=yes in the inline. Thanks to Simon McVittie for his persistance developing this feature. + * Add build-affected hook. Used by trail. -- Joey Hess Wed, 08 Feb 2012 16:07:00 -0400 diff --git a/debian/copyright b/debian/copyright index 8fddb682b..ee52c0eda 100644 --- a/debian/copyright +++ b/debian/copyright @@ -157,6 +157,10 @@ Files: IkiWiki/Plugin/osm.pm Copyright: © 2011 Blars Blarson, Antoine Beaupré License: GPL-2 +Files: IkiWiki/Plugin/trail.pm +Copyright: 2009-2012 Simon McVittie +License: GPL-2+ + Files: doc/logo/* Copyright: © 2006 Recai Oktaş License: GPL-2+ From 83aefff02fb9c95cbcd680722fd340bd62e3c7f7 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 14:47:29 -0400 Subject: [PATCH 191/849] mention that trail is set to "yes" --- doc/ikiwiki/directive/inline.mdwn | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/ikiwiki/directive/inline.mdwn b/doc/ikiwiki/directive/inline.mdwn index 4b11e5997..b2f1b5306 100644 --- a/doc/ikiwiki/directive/inline.mdwn +++ b/doc/ikiwiki/directive/inline.mdwn @@ -117,10 +117,10 @@ Here are some less often needed parameters: [[SubPage/LinkingRules]] as in a [[ikiwiki/WikiLink]]), and they are inlined in exactly the order given: the `sort` and `pages` parameters cannot be used in conjunction with this one. -* `trail` - If the [[!iki plugins/trail desc=trail]] plugin is enabled, turn - the inlined pages into a trail with next/previous links, by passing the same - options to [[ikiwiki/directive/trailitems]]. The `skip` and `show` options - are ignored by the trail, so the next/previous links traverse through - all matching pages. +* `trail` - If set to "yes" and the [[!iki plugins/trail desc=trail]] plugin + is enabled, turn the inlined pages into a trail with next/previous links, + by passing the same options to [[ikiwiki/directive/trailitems]]. The `skip` + and `show` options are ignored by the trail, so the next/previous links + traverse through all matching pages. [[!meta robots="noindex, follow"]] From 93972b1d94efff4ef73f43f7a5417a6e2cdd75dd Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 15:06:27 -0400 Subject: [PATCH 192/849] trail.t is failing --- doc/plugins/trail/discussion.mdwn | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/doc/plugins/trail/discussion.mdwn b/doc/plugins/trail/discussion.mdwn index 8b3981f0c..d08bd7477 100644 --- a/doc/plugins/trail/discussion.mdwn +++ b/doc/plugins/trail/discussion.mdwn @@ -41,3 +41,22 @@ work, but before sorting. > I've merged trail3-integrated, but not prebuild. I don't exactly dislike > prebuild, but dunno that the hook prolieration is worth the minor cleanup > it allows in trail. --[[Joey]] + +>> Hmm, t/trail.t is failing several tests here. --[[Joey]] + +
    +t/trail.t .................... 1/? 
    +#   Failed test at t/trail.t line 211.
    +#   Failed test at t/trail.t line 213.
    +#   Failed test at t/trail.t line 215.
    +#   Failed test at t/trail.t line 217.
    +#   Failed test at t/trail.t line 219.
    +#   Failed test at t/trail.t line 221.
    +#   Failed test at t/trail.t line 223.
    +#   Failed test at t/trail.t line 225.
    +#   Failed test at t/trail.t line 227.
    +#   Failed test at t/trail.t line 229.
    +#   Failed test at t/trail.t line 231.
    +
    + +> These all seem to relate to sorting. --[[Joey]] From d7eca43103a47f0184edb65e2bcf4240f795e3c6 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 15:27:49 -0400 Subject: [PATCH 193/849] test failure mysteriously vanished --- doc/plugins/trail/discussion.mdwn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/plugins/trail/discussion.mdwn b/doc/plugins/trail/discussion.mdwn index d08bd7477..4a12aa8e0 100644 --- a/doc/plugins/trail/discussion.mdwn +++ b/doc/plugins/trail/discussion.mdwn @@ -60,3 +60,6 @@ t/trail.t .................... 1/?
> These all seem to relate to sorting. --[[Joey]] + +>> This was reproducible once when I build the debian package, but +>> now I cannot reproduce it. --[[Joey]] From 3867f038a79784119e67ad36a191b64d2f574a3b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 15:54:47 -0400 Subject: [PATCH 194/849] load index file in osm cgi hook This hook involves urlto, and that needs to have state loaded to work in all situations. Note that I can see no reason for the osm plugin to use a cgi hook at all. This could just as well be a static html page! --- IkiWiki/Plugin/osm.pm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index be499495c..41202b4ef 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -521,6 +521,8 @@ sub cgi($) { return unless defined $cgi->param('do') && $cgi->param("do") eq "osm"; + + IkiWiki::loadindex(); IkiWiki::decode_cgi_utf8($cgi); From 917cdb7ade640c1e88f26d99acb42cff55a4c6fc Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 17:07:01 -0400 Subject: [PATCH 195/849] multiple osm fixes * fix will_render calls to pass proper relative filenames * fix urls to kml etc files to not assume wiki's top is at / * avoid building the javascript to display the map in two different ways between the cgi and on-page maps * refactor duplicate code --- IkiWiki/Plugin/osm.pm | 68 +++++++++++++++++++++++++----------- underlays/osm/ikiwiki/osm.js | 6 ++-- 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index 41202b4ef..661f72bab 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -154,18 +154,15 @@ sub process_waypoint { $icon = urlto($icon, $dest, 1); $tag = '' unless $tag; if ($page eq $dest) { - if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { - $config{'osm_format'} = 'KML'; - } - my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'}); + my %formats = get_formats(); if ($formats{'GeoJSON'}) { - will_render($page,$config{destdir} . "/$map/pois.json"); + will_render($page, "$map/pois.json"); } if ($formats{'CSV'}) { - will_render($page,$config{destdir} . "/$map/pois.txt"); + will_render($page, "$map/pois.txt"); } if ($formats{'KML'}) { - will_render($page,$config{destdir} . "/$map/pois.kml"); + will_render($page, "$map/pois.kml"); } } my $href = IkiWiki::cgiurl( @@ -292,10 +289,7 @@ sub savestate { } } - if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { - $config{'osm_format'} = 'KML'; - } - my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'}); + my %formats = get_formats(); if ($formats{'GeoJSON'}) { writejson(\%waypoints, \%linestrings); } @@ -436,7 +430,7 @@ Sample style: $writer->endTag(); $writer->end(); - writefile("pois.kmp", $config{destdir} . "/$map", $output); + writefile("pois.kml", $config{destdir} . "/$map", $output); } } @@ -484,7 +478,7 @@ sub format (@) { return $params{content}; } -sub prefered_format() { +sub preferred_format() { if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { $config{'osm_format'} = 'KML'; } @@ -492,19 +486,21 @@ sub prefered_format() { return shift @spl; } +sub get_formats() { + if (!defined($config{'osm_format'}) || !$config{'osm_format'}) { + $config{'osm_format'} = 'KML'; + } + map { $_ => 1 } split(/, */, $config{'osm_format'}); +} + sub include_javascript ($) { my $page=shift; my $loader; - eval q{use JSON}; - error $@ if $@; if (exists $pagestate{$page}{'osm'}) { foreach my $map (keys %{$pagestate{$page}{'osm'}}) { foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'displays'}}) { - my %options = %{$pagestate{$page}{'osm'}{$map}{'displays'}{$name}}; - $options{'map'} = $map; - $options{'format'} = prefered_format(); - $loader .= "mapsetup(\"mapdiv-$name\", " . to_json(\%options) . ");\n"; + $loader .= map_setup_code($map, $name, %{$pagestate{$page}{'osm'}{$map}{'displays'}{$name}}); } } } @@ -536,7 +532,15 @@ sub cgi($) { print ""; print "
"; print embed_map_code(); - print ""; + print ""; print ""; exit 0; @@ -549,4 +553,28 @@ sub embed_map_code(;$) { '" type="text/javascript" charset="utf-8">'."\n"; } +sub map_setup_code($;@) { + my $map=shift; + my $name=shift; + my %options=@_; + + eval q{use JSON}; + error $@ if $@; + + $options{'format'} = preferred_format(); + + my %formats = get_formats(); + if ($formats{'GeoJSON'}) { + $options{'jsonurl'} = urlto($map."/pois.json"); + } + if ($formats{'CSV'}) { + $options{'csvurl'} = urlto($map."/pois.txt"); + } + if ($formats{'KML'}) { + $options{'kmlurl'} = urlto($map."/pois.kml"); + } + + return "mapsetup('mapdiv-$name', " . to_json(\%options) . ");"; +} + 1; diff --git a/underlays/osm/ikiwiki/osm.js b/underlays/osm/ikiwiki/osm.js index 7994c62fc..d7e3d53f4 100644 --- a/underlays/osm/ikiwiki/osm.js +++ b/underlays/osm/ikiwiki/osm.js @@ -41,13 +41,13 @@ function mapsetup(divname, options) { map.addLayer(new OpenLayers.Layer.OSM()); if (options.format == 'CSV') { pois = new OpenLayers.Layer.Text( "CSV", - { location:"/" + options.map + "/pois.txt", + { location: options.csvurl, projection: map.displayProjection }); } else if (options.format == 'GeoJSON') { pois = new OpenLayers.Layer.Vector("GeoJSON", { protocol: new OpenLayers.Protocol.HTTP({ - url: "/" + options.map + "/pois.json", + url: options.jsonurl, format: new OpenLayers.Format.GeoJSON() }), strategies: [new OpenLayers.Strategy.Fixed()] @@ -55,7 +55,7 @@ function mapsetup(divname, options) { } else { pois = new OpenLayers.Layer.Vector("KML", { protocol: new OpenLayers.Protocol.HTTP({ - url: "/" + options.map + "/pois.kml", + url: options.kmlurl, format: new OpenLayers.Format.KML({ extractStyles: true, extractAttributes: true From 06aa145676c198e4b9c0ab26108aedd139bfd895 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 17:39:06 -0400 Subject: [PATCH 196/849] fix href parameter for osm This was not set anywhere, which causes their javascript to crash. It *seems* the idea is this is the url to use to view the map full screen, which uses ikiwiki.cgi. --- IkiWiki/Plugin/osm.pm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index 661f72bab..ef6bc5b11 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -101,6 +101,14 @@ sub preprocess { if ($zoom !~ /^\d\d?$/ || $zoom < 2 || $zoom > 18) { error("Bad zoom"); } + + if (! defined $href || ! length $href) { + $href=IkiWiki::cgiurl( + do => "osm", + map => $map, + ); + } + $pagestate{$page}{'osm'}{$map}{'displays'}{$name} = { height => $height, width => $width, From 5fcc4a9434fe8a698977a7a22b9b0113246e77b8 Mon Sep 17 00:00:00 2001 From: "http://hands.com/~phil/" Date: Sun, 18 Mar 2012 17:45:38 -0400 Subject: [PATCH 197/849] fix plugins/osm wikilink --- doc/plugins/contrib/googlemaps.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/plugins/contrib/googlemaps.mdwn b/doc/plugins/contrib/googlemaps.mdwn index 9d21a6b7a..c43490b13 100644 --- a/doc/plugins/contrib/googlemaps.mdwn +++ b/doc/plugins/contrib/googlemaps.mdwn @@ -18,4 +18,4 @@ It can be [found here][3]. [3]: http://www.tahina.priv.at/hacks/googlemaps.html -See also [[plugins/contrib/osm]]. +See also [[plugins/osm]]. From b2471aa729388243e598d389044d14fe86d5a7d5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 17:48:09 -0400 Subject: [PATCH 198/849] fix waypoint hrefs --- IkiWiki/Plugin/osm.pm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index ef6bc5b11..511fe3c9b 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -191,10 +191,11 @@ sub process_waypoint { tag => $tag, lat => $lat, lon => $lon, - # how to link back to the page from the map, not to be + # How to link back to the page from the map, not to be # confused with the URL of the map itself sent to the - # embeded map below - href => urlto($page,$map), + # embeded map below. Note: used in generated KML etc file, + # so must be absolute. + href => urlto($page), }; my $output = ''; if (defined($params{'embed'})) { From d92a19ff0886ee8518e4ccfc79a2c64feeac7213 Mon Sep 17 00:00:00 2001 From: "http://hands.com/~phil/" Date: Sun, 18 Mar 2012 17:50:45 -0400 Subject: [PATCH 199/849] fix plugins/mdwn wikilink --- doc/todo/internal_definition_list_support.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/todo/internal_definition_list_support.mdwn b/doc/todo/internal_definition_list_support.mdwn index 4550e4e32..f41f4d8a2 100644 --- a/doc/todo/internal_definition_list_support.mdwn +++ b/doc/todo/internal_definition_list_support.mdwn @@ -1,4 +1,4 @@ -While ikiwiki can support definition lists (`dl/dt/dd`) through [[multimarkdown|mdwn]], it doesn't actually /do/ anything with those valuable definitions. It would be interesting for third party plugins to have access to this stuff as a proper data structure. This is what allows MoinMoin to have plugins that collect that data across multiple pages and tabulate it, for example. +While ikiwiki can support definition lists (`dl/dt/dd`) through [[multimarkdown|plugins/mdwn]], it doesn't actually /do/ anything with those valuable definitions. It would be interesting for third party plugins to have access to this stuff as a proper data structure. This is what allows MoinMoin to have plugins that collect that data across multiple pages and tabulate it, for example. What I am proposing here is that the [[variables exported to plugins|plugins/write/#index6h2]] be extended to include a `%dictionnaries` hash. For a markup like this: From 1e0389fffbc33ad235e717756cb8b0b361f5b93b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 18:02:03 -0400 Subject: [PATCH 200/849] remove fullscreen option The cgi shows a fullscreen map, so having this other option to do it seems redundant, and also layering a fullscreen map over an existing wiki page doesn't look very good to me (and prevents editing the page etc). --- IkiWiki/Plugin/osm.pm | 25 +++++++------------------ doc/ikiwiki/directive/osm.mdwn | 12 +++++------- 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index 511fe3c9b..84e43b710 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -71,26 +71,15 @@ sub preprocess { my $lon = $params{'lon'}; # sanitized below my $href = $params{'href'}; - my $fullscreen = defined($params{'fullscreen'}); # sanitized here my ($width, $height, $float); - if ($fullscreen) { - $height = '100%'; - $width = '100%'; - $float = 0; - } - else { - $height = scrub($params{'height'} || "300px", $page, $dest); # sanitized here - $width = scrub($params{'width'} || "500px", $page, $dest); # sanitized here - $float = (defined($params{'right'}) && 'right') || (defined($params{'left'}) && 'left'); # sanitized here - } + $height = scrub($params{'height'} || "300px", $page, $dest); # sanitized here + $width = scrub($params{'width'} || "500px", $page, $dest); # sanitized here + $float = (defined($params{'right'}) && 'right') || (defined($params{'left'}) && 'left'); # sanitized here + my $zoom = scrub($params{'zoom'} // $config{'osm_default_zoom'} // 15, $page, $dest); # sanitized below my $map; - if ($fullscreen) { - $map = $params{'map'} || $page; - } - else { - $map = $params{'map'} || 'map'; - } + $map = $params{'map'} || 'map'; + $map = scrub($map, $page, $dest); # sanitized here my $name = scrub($params{'name'} || $map, $page, $dest); @@ -114,7 +103,7 @@ sub preprocess { width => $width, float => $float, zoom => $zoom, - fullscreen => $fullscreen, + fullscreen => 0, editable => defined($params{'editable'}), lat => $lat, lon => $lon, diff --git a/doc/ikiwiki/directive/osm.mdwn b/doc/ikiwiki/directive/osm.mdwn index a2cdd667f..6807a8198 100644 --- a/doc/ikiwiki/directive/osm.mdwn +++ b/doc/ikiwiki/directive/osm.mdwn @@ -27,18 +27,16 @@ icon.png (default, modifiable).. ## map display - * `map` - map to display, defaults to the current page - name in fullscreen mode, "map" otherwise + * `map` - map to display, defaults to "map" * `zoom` - the level to zoom to on the OSM map * `loc` - lattitude and longitude of the map center * `lat` - lattitude * `lon` - longitude - * `fullscreen` - make the map take the whole screen through CSS * `editable` - add edit controls in a separate layer - * `right` - float the map right, ignored for fullscreen - * `left` - float the map left (default unless fullscreen) - * `width` - width of the map, ignored for fullscreen - * `height` - height of the map, ignored for fullscreen + * `right` - float the map right + * `left` - float the map left (default) + * `width` - width of the map + * `height` - height of the map ## waypoints From 0faceb91c07636284e8543d517721a25dbe29058 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 19:33:11 -0400 Subject: [PATCH 201/849] misc cleanup --- IkiWiki/Plugin/osm.pm | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm index 84e43b710..8bf6ae93b 100644 --- a/IkiWiki/Plugin/osm.pm +++ b/IkiWiki/Plugin/osm.pm @@ -64,12 +64,12 @@ sub getsetup () { sub preprocess { my %params=@_; - my $page = $params{'page'}; - my $dest = $params{'destpage'}; - my $loc = $params{'loc'}; # sanitized below - my $lat = $params{'lat'}; # sanitized below - my $lon = $params{'lon'}; # sanitized below - my $href = $params{'href'}; + my $page = $params{page}; + my $dest = $params{destpage}; + my $loc = $params{loc}; # sanitized below + my $lat = $params{lat}; # sanitized below + my $lon = $params{lon}; # sanitized below + my $href = $params{href}; my ($width, $height, $float); $height = scrub($params{'height'} || "300px", $page, $dest); # sanitized here @@ -162,17 +162,6 @@ sub process_waypoint { will_render($page, "$map/pois.kml"); } } - my $href = IkiWiki::cgiurl( - do => "osm", - map => $map, - lat => $lat, - lon => $lon, - zoom => $zoom, - ); - if (defined($destsources{htmlpage($map)})) { - $href = urlto($map,$page) . "?lat=$lat&lon=$lon&zoom=$zoom"; - $href =~ s!&!&!g; - } $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = { page => $page, desc => $desc, @@ -186,13 +175,22 @@ sub process_waypoint { # so must be absolute. href => urlto($page), }; + + my $mapurl = IkiWiki::cgiurl( + do => "osm", + map => $map, + lat => $lat, + lon => $lon, + zoom => $zoom, + ); my $output = ''; if (defined($params{'embed'})) { - $params{'href'} = $href; # propagate down to embeded - $output .= preprocess(%params); + $output .= preprocess(%params, + href => $mapurl, + ); } if (!$hidden) { - $output .= ""; + $output .= ""; } return $output; } From 914c362197597278bf077a263da0e5cb5021fc6b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 18 Mar 2012 19:55:50 -0400 Subject: [PATCH 202/849] reproduce test suite failure, start of analysis --- doc/plugins/trail/discussion.mdwn | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/plugins/trail/discussion.mdwn b/doc/plugins/trail/discussion.mdwn index 4a12aa8e0..2ddf2ce45 100644 --- a/doc/plugins/trail/discussion.mdwn +++ b/doc/plugins/trail/discussion.mdwn @@ -42,7 +42,8 @@ work, but before sorting. > prebuild, but dunno that the hook prolieration is worth the minor cleanup > it allows in trail. --[[Joey]] ->> Hmm, t/trail.t is failing several tests here. --[[Joey]] +>> Hmm, t/trail.t is failing several tests here. To reproduce, I build the +>> debian package from a clean state, or `rm -rf .t` between test runs. --[[Joey]]
 t/trail.t .................... 1/? 
@@ -59,7 +60,10 @@ t/trail.t .................... 1/?
 #   Failed test at t/trail.t line 231.
 
-> These all seem to relate to sorting. --[[Joey]] - ->> This was reproducible once when I build the debian package, but ->> now I cannot reproduce it. --[[Joey]] +> Looking at the first of these, it expected "trail=sorting n=sorting/new p=" +> but gets: "trail=sorting n=sorting/ancient p=sorting/new" +> +> Looking at the second failure, it expected "trail=sorting n=sorting/middle p=sorting/old$" +> but got: "trail=sorting n=sorting/old p=sorting/end" +> +> Perhaps a legitimate bug? --[[Joey]] From c7bc11f26fc4aa8e2a9c7e1bec60076944181b52 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 19 Mar 2012 09:49:31 +0000 Subject: [PATCH 203/849] Use utime to make initial files in trail test come from the past This ensures that when we do the second phase of the test (edit some files and refresh), the changes get a different mtime and are picked up, even if the entire test happened between two 1-second "clock ticks". --- t/trail.t | 73 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/t/trail.t b/t/trail.t index 17fe54310..b24a81e41 100755 --- a/t/trail.t +++ b/t/trail.t @@ -9,9 +9,19 @@ my $blob; ok(! system("rm -rf t/tmp")); ok(! system("mkdir t/tmp")); +# Write files with a date in the past, so that when we refresh, +# the update is detected. +sub write_old_file { + my $name = shift; + my $content = shift; + + writefile($name, "t/tmp/in", $content); + ok(utime(333333333, 333333333, "t/tmp/in/$name")); +} + # Use a rather stylized template to override the default rendering, to make # it easy to search for the desired results -writefile("templates/trails.tmpl", "t/tmp/in", <
+ +> Have you considered all the ways that anyone with edit access to the +> public wiki could expose information from the public wiki? For example, +> you could inline all the private pages into a public page. --[[Joey]] From bbf1c14769dd160cd1d534737f18eece1f07d634 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 25 Aug 2012 10:57:32 -0400 Subject: [PATCH 647/849] remove mention of defunct twitter feed --- doc/git.mdwn | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/git.mdwn b/doc/git.mdwn index 1da9fbfbd..407da280c 100644 --- a/doc/git.mdwn +++ b/doc/git.mdwn @@ -14,8 +14,7 @@ The gitweb is [here](http://source.ikiwiki.branchable.com/?p=source.git;a=summar Commits to this git repository are fed into [CIA](http://cia.vc), and can be browsed, subscribed to etc on its -[project page](http://cia.vc/stats/project/ikiwiki). They're also fed into -[twitter](http://twitter.com/ikiwiki). +[project page](http://cia.vc/stats/project/ikiwiki). ## personal git repositories From 80fa5c82a54084b37fdc96fa64978b0a970b5c30 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 25 Aug 2012 11:08:57 -0400 Subject: [PATCH 648/849] releasing version 3.20120725 --- debian/changelog | 4 ++-- ikiwiki.spec | 2 +- po/ikiwiki.pot | 22 +++++++++++----------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/debian/changelog b/debian/changelog index 8c1c685be..c2c58861a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -ikiwiki (3.20120630) UNRELEASED; urgency=low +ikiwiki (3.20120725) unstable; urgency=low * recentchangesdiff: When diffurl is not set, provide inline diffs in the recentchanges page, with visibility toggleable via javascript. @@ -12,7 +12,7 @@ ikiwiki (3.20120630) UNRELEASED; urgency=low Thanks, Antoine Beaupré * comments: Remove ipv6 address specific code. - -- Joey Hess Thu, 19 Jul 2012 13:46:52 -0400 + -- Joey Hess Sat, 25 Aug 2012 10:58:42 -0400 ikiwiki (3.20120629) unstable; urgency=low diff --git a/ikiwiki.spec b/ikiwiki.spec index 596b465f8..1ad95f9c6 100644 --- a/ikiwiki.spec +++ b/ikiwiki.spec @@ -1,5 +1,5 @@ Name: ikiwiki -Version: 3.20120629 +Version: 3.20120725 Release: 1%{?dist} Summary: A wiki compiler diff --git a/po/ikiwiki.pot b/po/ikiwiki.pot index 9f22d2146..393a72d5c 100644 --- a/po/ikiwiki.pot +++ b/po/ikiwiki.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-29 10:17-0400\n" +"POT-Creation-Date: 2012-08-25 11:01-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -253,37 +253,37 @@ msgstr "" msgid "comments on page '%s' are closed" msgstr "" -#: ../IkiWiki/Plugin/comments.pm:551 +#: ../IkiWiki/Plugin/comments.pm:548 msgid "comment stored for moderation" msgstr "" -#: ../IkiWiki/Plugin/comments.pm:553 +#: ../IkiWiki/Plugin/comments.pm:550 msgid "Your comment will be posted after moderator review" msgstr "" -#: ../IkiWiki/Plugin/comments.pm:566 +#: ../IkiWiki/Plugin/comments.pm:563 msgid "Added a comment" msgstr "" -#: ../IkiWiki/Plugin/comments.pm:570 +#: ../IkiWiki/Plugin/comments.pm:567 #, perl-format msgid "Added a comment: %s" msgstr "" -#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55 +#: ../IkiWiki/Plugin/comments.pm:637 ../IkiWiki/Plugin/userlist.pm:55 #: ../IkiWiki/Plugin/websetup.pm:272 msgid "you are not logged in as an admin" msgstr "" -#: ../IkiWiki/Plugin/comments.pm:694 +#: ../IkiWiki/Plugin/comments.pm:691 msgid "Comment moderation" msgstr "" -#: ../IkiWiki/Plugin/comments.pm:735 +#: ../IkiWiki/Plugin/comments.pm:732 msgid "comment moderation" msgstr "" -#: ../IkiWiki/Plugin/comments.pm:896 +#: ../IkiWiki/Plugin/comments.pm:893 #, perl-format msgid "%i comment" msgid_plural "%i comments" @@ -293,7 +293,7 @@ msgstr[1] "" #. translators: Here "Comment" is a verb; #. translators: the user clicks on it to #. translators: post a comment. -#: ../IkiWiki/Plugin/comments.pm:906 +#: ../IkiWiki/Plugin/comments.pm:903 msgid "Comment" msgstr "" @@ -844,7 +844,7 @@ msgstr "" msgid "confirm reversion of %s" msgstr "" -#: ../IkiWiki/Plugin/recentchangesdiff.pm:47 +#: ../IkiWiki/Plugin/recentchangesdiff.pm:49 msgid "(Diff truncated)" msgstr "" From d5ac645ae69d982c5906e6c9f19e727fe918aaba Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 25 Aug 2012 11:09:22 -0400 Subject: [PATCH 649/849] add news item for ikiwiki 3.20120725 --- doc/news/version_3.20120202.mdwn | 11 ----------- doc/news/version_3.20120725.mdwn | 13 +++++++++++++ 2 files changed, 13 insertions(+), 11 deletions(-) delete mode 100644 doc/news/version_3.20120202.mdwn create mode 100644 doc/news/version_3.20120725.mdwn diff --git a/doc/news/version_3.20120202.mdwn b/doc/news/version_3.20120202.mdwn deleted file mode 100644 index 3a9ebeb2a..000000000 --- a/doc/news/version_3.20120202.mdwn +++ /dev/null @@ -1,11 +0,0 @@ -ikiwiki 3.20120202 released with [[!toggle text="these changes"]] -[[!toggleable text=""" - * mdwn: Added nodiscount setting, which can be used to avoid using the - markdown discount engine, when maximum compatability is needed. - * Switch to YAML::XS to work around insanity in YAML::Mo. Closes: #[657533](http://bugs.debian.org/657533) - * cvs: Ensure text files are added in non-binary mode. (Amitai Schlair) - * cvs: Various cleanups and testing. (Amitai Schlair) - * calendar: Fix strftime encoding bug. - * shortcuts: Fixed a broken shortcut to wikipedia (accidentially - made into a shortcut to wikiMedia). - * Various portability improvements. (Amitai Schlair)"""]] \ No newline at end of file diff --git a/doc/news/version_3.20120725.mdwn b/doc/news/version_3.20120725.mdwn new file mode 100644 index 000000000..08e2c771f --- /dev/null +++ b/doc/news/version_3.20120725.mdwn @@ -0,0 +1,13 @@ +ikiwiki 3.20120725 released with [[!toggle text="these changes"]] +[[!toggleable text=""" + * recentchangesdiff: When diffurl is not set, provide inline diffs + in the recentchanges page, with visibility toggleable via javascript. + Thanks, Antoine Beaupré + * Split CFLAGS into words when building wrapper. Closes: #[682237](http://bugs.debian.org/682237) + * osm: Avoid calling urlto before generated files are registered. + Thanks, Philippe Gauthier and Antoine Beaupré + * osm: Add osm\_openlayers\_url configuration setting. + Thanks, Genevieve + * osm: osm\_layers can be used to configured the layers displayed on the map. + Thanks, Antoine Beaupré + * comments: Remove ipv6 address specific code."""]] \ No newline at end of file From d5fc6c1a22ea88bddc97ff4053ef53888ed82cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20Beaupr=C3=A9?= Date: Sun, 26 Aug 2012 23:54:54 -0400 Subject: [PATCH 650/849] expand nginx documentation --- doc/tips/dot_cgi.mdwn | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/doc/tips/dot_cgi.mdwn b/doc/tips/dot_cgi.mdwn index 42a0aa7bf..e7fe7b2c8 100644 --- a/doc/tips/dot_cgi.mdwn +++ b/doc/tips/dot_cgi.mdwn @@ -60,7 +60,41 @@ If you have any thought about it, feel free to let me know. ## nginx -* To run CGI under nginx, just use a FastCGI wrapper like [this one](http://technotes.1000lines.net/?p=23). The wrapper must be started somehow just like any other FastCGI program. I use launchd on OSX. +To run CGI under nginx, just use a FastCGI wrapper like [this one](http://technotes.1000lines.net/?p=23). The wrapper must be started somehow just like any other FastCGI program. I use launchd on OSX. + +In Linux, you will need the spawn-fcgi and fcgiwrap packages and start +them with: + + spawn-fcgi -s /tmp/fcgi.socket -n -- /usr/sbin/fcgiwrap + +This needs to be ran as your user. It can be added to `inittab` or +made into a startup script in `init.d`. + +Then you need an nginx config plugged in that wrapper. Here's an +example virtual host configuration: + + server { + #listen 80; ## listen for ipv4; this line is default and implied + #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 + + root /home/anarcat/public_html/wiki.reseaulibre.ca/; + index index.html index.htm; + + # Make site accessible from http://localhost/ + server_name wiki.reseaulibre.ca; + + location / { + try_files $uri $uri/ /index.html; + } + location /ikiwiki.cgi { + fastcgi_pass unix:/tmp/fcgi.socket; + fastcgi_index ikiwiki.cgi; + fastcgi_param SCRIPT_FILENAME /home/anarcat/public_html/ikiwiki.cgi; + fastcgi_param DOCUMENT_ROOT /home/anarcat/public_html/wiki.reseaulibre.ca; + include /etc/nginx/fastcgi_params; + } + } + ## boa From 66d7919fea38f50c2ae2d3d77ff26b4088542721 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Mon, 27 Aug 2012 00:12:16 -0400 Subject: [PATCH 651/849] crap. yet another problem with OSM, although minor: nginx-specific... --- ..._maps_icon_path_have_a_trailing_slash.mdwn | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 doc/bugs/osm_KML_maps_icon_path_have_a_trailing_slash.mdwn diff --git a/doc/bugs/osm_KML_maps_icon_path_have_a_trailing_slash.mdwn b/doc/bugs/osm_KML_maps_icon_path_have_a_trailing_slash.mdwn new file mode 100644 index 000000000..0677d0e74 --- /dev/null +++ b/doc/bugs/osm_KML_maps_icon_path_have_a_trailing_slash.mdwn @@ -0,0 +1,32 @@ +This is not a problem on Apache webservers because they, oddly enough, ignore trailing slashes on paths (maybe some `PATH_INFO` magic, no idea). But basically, in our wiki, the paths to the icon tags are generated with a trailing slash. An excerpt of our [KML file](http://wiki.reseaulibre.ca/map/pois.kml): + + + +Notice the trailing `/` after the `icon.png`. This breaks display on nginx - the file that gets served isn't the icon, but the frontpage for some reason. I followed the [[setup instructions|tips/dot cgi]] for Nginx that I just had to write because there weren't any, so maybe I screwed up some part, but it does seem to me that the trailing slash is wrong regardless. + +(Also notice how the style tag is being turned over backwards by the HTML sanitizer here, cute. :P) + +I wrote a crude hack for this, but this strikes me as a similar problem to the one we found in [[bugs/osm linkto() usage breaks map rendering]]. However, I am at a loss how to fix this cleanly because we cannot `will_render()` the tag icons, as they are already generated out there! Weird. Anyways, here's the stupid [[patch]]: + +[[!format diff """ +diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm +index a7baa5f..c9650d0 100644 +--- a/IkiWiki/Plugin/osm.pm ++++ b/IkiWiki/Plugin/osm.pm +@@ -192,6 +192,7 @@ sub process_waypoint { + } + } + $icon = urlto($icon, $dest, 1); ++ $icon =~ s!/*$!!; # hack - urlto shouldn't be appending a slash in the first place + $tag = '' unless $tag; + register_rendered_files($map, $page, $dest); + $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = { +"""]] + +I'm not writing this to a branch out of sheer shame of my misunderstanding. ;) There also may be a workaround that could be done in Nginx too. --[[anarcat]] From 8f7fc90a9c92d8720a1455431f0f56d55b1fee2d Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Mon, 27 Aug 2012 00:18:21 -0400 Subject: [PATCH 652/849] small fixes on nginx documentation, refer to fastcgi stuff --- doc/tips/dot_cgi.mdwn | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/tips/dot_cgi.mdwn b/doc/tips/dot_cgi.mdwn index e7fe7b2c8..7fbe278a4 100644 --- a/doc/tips/dot_cgi.mdwn +++ b/doc/tips/dot_cgi.mdwn @@ -60,7 +60,7 @@ If you have any thought about it, feel free to let me know. ## nginx -To run CGI under nginx, just use a FastCGI wrapper like [this one](http://technotes.1000lines.net/?p=23). The wrapper must be started somehow just like any other FastCGI program. I use launchd on OSX. +To run CGI under nginx, you need to use a FastCGI wrapper. The wrapper must be started somehow just like any other FastCGI program. You can use launchd on OSX. In Linux, you will need the spawn-fcgi and fcgiwrap packages and start them with: @@ -95,6 +95,7 @@ example virtual host configuration: } } +Also, note that the `/tmp/fcgi.socket` file needs to be writable by the webserver. I am also unsure as to the security of this setup, as I am using this only on my dev server. Needless to say that [[real fastcgi support|todo/fastcgi_or_modperl_installation_instructions]] would be great. ;) --[[anarcat]] ## boa From 46ead22defecdba13f5ad5ddfd3e8bff8068f1e8 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Mon, 27 Aug 2012 00:34:01 -0400 Subject: [PATCH 653/849] explain how fastcgi could work. joeyh: this could help branchable.com's performance, i think (no idea if .cgi is a problem now...) --- doc/todo/fastcgi_or_modperl_installation_instructions.mdwn | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/todo/fastcgi_or_modperl_installation_instructions.mdwn b/doc/todo/fastcgi_or_modperl_installation_instructions.mdwn index 74dcaeb61..ad7910956 100644 --- a/doc/todo/fastcgi_or_modperl_installation_instructions.mdwn +++ b/doc/todo/fastcgi_or_modperl_installation_instructions.mdwn @@ -9,4 +9,10 @@ There has got to be a way to run the CGI wrapper under fastcgi or modperl (apach > I've not looked at what code changes fastcgi or modperl would require in > ikiwiki. --[[Joey]] +> > Looking at nginx support in [[tips/dot_cgi]], I had to figure that out, and it's not so complicated. The hackish way that's documented there right now (and also supported by [answers on serverfault.com](http://serverfault.com/questions/93090/installing-ikiwiki-on-nginx-fastcgi-fcgi-wrapper) or [other](http://vilain.net/comp/ikiwiki_setup.html) [guides](https://library.linode.com/web-applications/wikis/ikiwiki/arch-linux)), and involves starting up a fcgi wrapper, which I find personnally quite weird. +> > +> > Otherwise the general idea would be to launch a daemon per site that would have a pool of fastcgi processes to answer requests. The common setup pattern here is that users have a fixed quota of processes running as their user, listening either on the network (hackish: a port need to be allocated for each user) or on a socket (documented above, but then the webserver needs write access). +> > +> > Perl has had extensive support for FastCGI for quite a while. It seems to me a simple daemon could be written to wrap around the `.cgi`, it's a common way things are deployed. [RT](http://rt.bestpractical.com/) for example can run as a regular CGI, under `mod_perl` or `FastCGI` indiscrimenatly, the latter being more reliable and faster. They use [Plack](http://search.cpan.org/dist/Plack/) to setup that server (see the [startup script](https://github.com/bestpractical/rt/blob/stable/sbin/rt-server.in) for an example). But of course, [TIMTOWTDI](http://search.cpan.org/search?query=fastcgi&mode=all). --[[anarcat]] + [[!tag wishlist]] From f38e192ae26e863305d644a6bf2a0649d235436a Mon Sep 17 00:00:00 2001 From: Giuseppe Bilotta Date: Mon, 27 Aug 2012 08:43:57 +0200 Subject: [PATCH 654/849] Report issue with strange feed removal --- ...eds_get_removed_in_strange_conditions.mdwn | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 doc/bugs/feeds_get_removed_in_strange_conditions.mdwn diff --git a/doc/bugs/feeds_get_removed_in_strange_conditions.mdwn b/doc/bugs/feeds_get_removed_in_strange_conditions.mdwn new file mode 100644 index 000000000..deec208ba --- /dev/null +++ b/doc/bugs/feeds_get_removed_in_strange_conditions.mdwn @@ -0,0 +1,57 @@ +For some time now, in circumstances that I've had enormous troubles +trying to track, I've seen feeds getting removed by ikiwiki when +apparently unrelated pages got changed, with the message: + +> removing somepath/somepage/somefeed, no longer built by some/unrelated/page + +I've finally been able to find how and why it happens. The situation is +the following: + +* page A has an inline directive that (directly) generates a feed F +* page B inlines A, thus (indirectly) generating F again +* page B is rendered after page A + +The feed removal happens when changes are made to prevent B from +inlining A; for example, because B is a tag page and A is untagged B, or +because B includes A through a pagespec that no longer matches A. In +this case, this happens: + +* page A is built, rendering F +* page B is built, _not_ rendering F, which it used to render +* F is removed because it is not built by B anymore + +Note that although this issue is triggered (for me) from the changes I +proposed last year to allow feed generation from nested inlines +coalescing it to be page-based instead of destpage-based +(bb8f76a4a04686def8cc6f21bcca80cb2cc3b2c9 and +72c8f01b36c841b0e83a2ad7ad1365b9116075c5) there is potential for it +popping up in other cases. + +Specifically, the logic for the removal of dependent pages currently +relies on the assumption that each output has a single generator. My +changes caused this assumption to be violated, hence the error, but +other cases may pop up for other plugins in the future. + +I have a [patch] fixing this issue (for feeds specifically, i.e. only +the problem I am actually having) on top of my `mystuff` branch, but +since that also has heaps of other unrelated stuff, you may want to just +[pick it from my gitweb][gw]. + +[gw]: (http://git.oblomov.eu/ikiwiki/patch/671cb26cf50643827f258270d9ac8ad0b1388a65) + +The patch changes the `will_render()` for feeds to be based on the page +rather than on the destpage, matching the fact that for nested inlines +it's the inner page that is ultimately responsible for generating the +feed. + +I've noticed that it requires at least _two_ full rebuilds before the +index is again in a sensible state. (On the first rebuild, all feeds +from nested inlines are actually _removed_.) + +While the patch is needed because there are legitimate cases in which +nested feeds are needed (for example, I have an index page that inlines +index pages for subsection of my site, and I want _those_ feed from +being visible), there are other cases when one may want to skip feed +generation from nested inlines. + +--[[GiuseppeBilotta]] From f1af9815295ffe2b363bbe10cd97395c44f294ee Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik" Date: Tue, 28 Aug 2012 10:28:10 -0400 Subject: [PATCH 655/849] --- doc/forum/Problem_with_local_git_commit.mdwn | 42 ++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 doc/forum/Problem_with_local_git_commit.mdwn diff --git a/doc/forum/Problem_with_local_git_commit.mdwn b/doc/forum/Problem_with_local_git_commit.mdwn new file mode 100644 index 000000000..e9dfdb417 --- /dev/null +++ b/doc/forum/Problem_with_local_git_commit.mdwn @@ -0,0 +1,42 @@ +I have a problem when I edit my wiki with a text editor and use just git to commit. + +Suppose `iki` is my scrdir and `iki.git` my repository. Then I did `git clone iki.git myiki` to get a copy. Then I do + + cd myiki + echo "test" >> somepage.mdwm" + git add somepage.mdwm + git pull + git commit -m "test" + git push + +Then I get the following error message + + Counting objects: 5, done. + Delta compression using up to 2 threads. + Compressing objects: 100% (2/2), done. + Writing objects: 100% (3/3), 287 bytes, done. + Total 3 (delta 1), reused 0 (delta 0) + Unpacking objects: 100% (3/3), done. + remote: From /home/myuser/iki + remote: 32bb6be..1f3a647 master -> origin/master + remote: There are no candidates for merging among the refs that you just fetched. + remote: Generally this means that you provided a wildcard refspec which had no + remote: matches on the remote end. + remote: 'git pull --prune origin' failed: at /usr/share/perl5/IkiWiki/Plugin/git.pm line 207. + remote: skipping bad filename local.css~ + remote: skipping bad filename #tex_sandbox.mdwn# + To /home/myuser/iki.git + 32bb6be..1f3a647 master -> master + +When I check the repository via gitk I see that everything seems to be ok, if I check the scrdir the same way origin master is one step away from master and the change doesn't appear on the iki web page. Then I tried to do a `sudo git pull --prune origin master` in my scrdir which sets master to the head, but the change isn't there anyway. It foremost appears when I do a second change as above or if I do `sudo ikiwiki --setup iki.setup`. + +By the way the setup gives me a similar error message: + + successfully generated /var/www/iki/ikiwiki.cgi + successfully generated /home/myuser/iki.git/hooks/post-update + There are no candidates for merging among the refs that you just fetched. + Generally this means that you provided a wildcard refspec which had no + matches on the remote end. + 'git pull --prune origin' failed: at /usr/share/perl5/IkiWiki/Plugin/git.pm line 207. + +Any ideas what may be wrong here and how to fix this? From 483099ffdd6bbd16d0aebe3242eb4c1ccf340157 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawnKM32pOD0EVLBe-Xf16qiF_prS3RQ7x_I" Date: Tue, 28 Aug 2012 11:33:34 -0400 Subject: [PATCH 656/849] Initial import. --- doc/users/RickOwens.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/users/RickOwens.mdwn diff --git a/doc/users/RickOwens.mdwn b/doc/users/RickOwens.mdwn new file mode 100644 index 000000000..c619569d8 --- /dev/null +++ b/doc/users/RickOwens.mdwn @@ -0,0 +1 @@ +I'm a Systems Analyst in Montana. I use ikiwiki as a private notebook/journal/worklog/etc. From 9bd8cd2542d1c7f3b9c27f96602f1ff36babd919 Mon Sep 17 00:00:00 2001 From: "http://jmtd.net/" Date: Wed, 29 Aug 2012 11:58:11 -0400 Subject: [PATCH 657/849] --- doc/todo/monochrome_theme.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/todo/monochrome_theme.mdwn b/doc/todo/monochrome_theme.mdwn index a1956e683..4894c71fb 100644 --- a/doc/todo/monochrome_theme.mdwn +++ b/doc/todo/monochrome_theme.mdwn @@ -11,3 +11,5 @@ Perhaps controversially, I think that this would be a good basis for a default t > redundant since ikiwiki's style.css gets prepended to the theme's stylesheet > at build time! Can you remove those redundant bits please? (PITA I know, > but it will make maintaining this much easier.) --[[Joey]] + +>> Sure I'll sort that out. Sorry, I didn't realise the prepending was an automatic process. I did it manually. It should be quick for me to fix. — [[Jon]] From 38d258b171acf7268c7a2bbeaf2cb910b74a025a Mon Sep 17 00:00:00 2001 From: Jon Dowland Date: Wed, 15 Aug 2012 20:42:33 +0100 Subject: [PATCH 658/849] new theme: monochrome --- doc/themes.mdwn | 5 ++++ doc/themes/monochrome.png | Bin 0 -> 133348 bytes themes/monochrome/gradient.png | Bin 0 -> 2466 bytes themes/monochrome/style.css | 53 +++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 doc/themes/monochrome.png create mode 100644 themes/monochrome/gradient.png create mode 100644 themes/monochrome/style.css diff --git a/doc/themes.mdwn b/doc/themes.mdwn index 57f899677..9f7f78dbf 100644 --- a/doc/themes.mdwn +++ b/doc/themes.mdwn @@ -21,6 +21,11 @@ blueview and featuring the photography of Lars Wirzenius.
+[[!img monochrome.png size="192x146" align==left]] The **monochrome** theme, +based on [[Jon]]'s homepage design. + +
+ [[!img none_small.png align=left]] For completeness, ikiwiki's default anti-theme. diff --git a/doc/themes/monochrome.png b/doc/themes/monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5854d8305286621fd2d4fa75aba15a6618160b GIT binary patch literal 133348 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

JxzVMw6Lbo{Q{laIt3$P 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 JM#1vK{{Y3$76$+T literal 0 HcmV?d00001 diff --git a/themes/monochrome/gradient.png b/themes/monochrome/gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..7363185d54066c229b57a84fb231410e0e0a15b1 GIT binary patch literal 2466 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 + */ +#content a[href^="http:"]:after, +#content a[href^="https:"]:after { + content: "↗"; +} +/* you will want to replicate this for your own domain in local.css */ +#content a[href^="http://localhost"]:after, +#content a[href^="http://ikiwiki.info"]:after { + content: none; +} + +/* colouring */ +a:link { color: #c00040; font-weight: bold; text-decoration: none; } +a:hover { color: #f01070; text-decoration: underline;} +a:active { color: #c00040; } +a:visited { color: #c08080; font-weight: normal; font-style: italic; } +hr { border: none; border-top: 2px solid #c00040; clear: both; } From aee3811150f995e9944c13d59e3eb5f17bdcf6d1 Mon Sep 17 00:00:00 2001 From: "http://jmtd.net/" Date: Thu, 30 Aug 2012 11:36:29 -0400 Subject: [PATCH 659/849] fixed --- doc/todo/monochrome_theme.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/todo/monochrome_theme.mdwn b/doc/todo/monochrome_theme.mdwn index 4894c71fb..ebaca9b4f 100644 --- a/doc/todo/monochrome_theme.mdwn +++ b/doc/todo/monochrome_theme.mdwn @@ -13,3 +13,5 @@ Perhaps controversially, I think that this would be a good basis for a default t > but it will make maintaining this much easier.) --[[Joey]] >> Sure I'll sort that out. Sorry, I didn't realise the prepending was an automatic process. I did it manually. It should be quick for me to fix. — [[Jon]] + +>>> Fixed. I rebased the branch; hopefully that won't cause your script issues. — [[Jon]] From 4eb97eea7a698a087acde3c695d632fa7d43cef2 Mon Sep 17 00:00:00 2001 From: Jon Dowland Date: Thu, 30 Aug 2012 16:44:12 +0100 Subject: [PATCH 660/849] wishlist feature: marking things to be published in the future --- doc/todo/publishing_in_the_future.mdwn | 91 ++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 doc/todo/publishing_in_the_future.mdwn diff --git a/doc/todo/publishing_in_the_future.mdwn b/doc/todo/publishing_in_the_future.mdwn new file mode 100644 index 000000000..a3cdacedb --- /dev/null +++ b/doc/todo/publishing_in_the_future.mdwn @@ -0,0 +1,91 @@ +[[!tag wishlist]]I would quite like the ability to write a page (blog post in +practice) but for the page to not be displayed until a date and time after it +is added to the wiki. I've thought this through a bit, but would appreciate +feedback from people before I go any further. Would anyone else find this +useful? + +Thinking about how to implement this in ikiwiki, perhaps a conditional +pagespec would be best (which could be tidied up into a template) + + [[!if test="current_date_before()" + then="""[[!tag draft]]""" + else="""[[!meta date=""]]""" + ]] + +…pre-supposing a scheme whereby tagging 'draft' hides the page from an +aggregation somewhere. With a template, this could collapse to + + [[!template id=publishafter date="Thu Aug 30 14:13:06 BST 2012"]] + +This would require implementing the `current_date_before` pagespec. + +You would also need a regularly scheduled wiki refresh and a way of marking the +unpublished pages as 'dirty' so they were always scanned on refresh until their +publish date has occurred. That could perhaps be implemented via a small plugin +which defined a pagespec which ensured the page was 'dirty': + + [[!if test="current_date_before()" + then="""[[!tag draft]][[!dirty]]""" + else="""[[!meta date=""]]""" + ]] + +The following is an attempt at the dirty part: + + #!/usr/bin/perl + package IkiWiki::Plugin::dirty; + # provides a pagespec 'dirty' which ensures the page will always be + # re-scanned for content on wiki refresh. + + use warnings; + use strict; + use IkiWiki 3.00; + + hook(type => "preprocess", id => "dirty", call => \&preprocess); + hook(type => "needsbuild", id => "dirty", call => \&needsbuild); + + sub preprocess (@) { + my %params = @_; + $pagestate{$params{page}}{dirty}{dirty} = 1; + return ''; + } + + sub needsbuild (@) { + my $pages= shift; + my %p2 = map { $_ => 1 } @$pages; + my %d2 = map { $_ => 1 } @$deleted; + + foreach my $page (keys %pagestate) { + if(exists $pagestate{$page}{dirty}{dirty}) { + push @$pages, $pagesources{$page} unless + (exists $p2{$pagesources{$page}} or exists $d2{$pagesources{$page}}); + delete $pagestate{$page}{dirty}{dirty}; + } + } + + return $pages; + } + + 1 + +Although it doesn't fit, the `current_date_before` pagespec could be implemented +in the same plugin. I tried the following (before the trailing `1`): + + package IkiWiki::PageSpec; + use Date::Parse; + + sub match_current_date_before ($$;@) { + shift; + my $date = shift; + my $out = str2time($date); + if(defined $out) { + return IkiWiki::SuccessReason->new("time before now") if $out < time(); + return IkiWiki::FailReason->new("time not before now"); + } else { return IkiWiki::ErrorReason->new("couldn't parse time $date")}; + } + +I always hit the `ErrorReason` branch when I try to use it, even with strings +which work fine in test scripts. If anyone can help me debug that I'd be very +grateful. +If anyone has any clues as to why this doesn't work + +Thoughts on the whole idea? — [[Jon]] From 34923d1abb76ba3b367ad7ab9221b1d6c09ef439 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 30 Aug 2012 11:55:28 -0400 Subject: [PATCH 661/849] scale monoschome theme screenshot to same size as others --- doc/themes.mdwn | 2 +- doc/themes/monochrome.png | Bin 133348 -> 0 bytes doc/themes/monochrome_small.png | Bin 0 -> 21054 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 doc/themes/monochrome.png create mode 100644 doc/themes/monochrome_small.png diff --git a/doc/themes.mdwn b/doc/themes.mdwn index 9f7f78dbf..7df25e66b 100644 --- a/doc/themes.mdwn +++ b/doc/themes.mdwn @@ -21,7 +21,7 @@ blueview and featuring the photography of Lars Wirzenius.
-[[!img monochrome.png size="192x146" align==left]] The **monochrome** theme, +[[!img monochrome_small.png align==left]] The **monochrome** theme, based on [[Jon]]'s homepage design.
diff --git a/doc/themes/monochrome.png b/doc/themes/monochrome.png deleted file mode 100644 index 0d5854d8305286621fd2d4fa75aba15a6618160b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133348 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
+
+ +
+
+ +
+ +
+
+ +
+
+
updated 12:12 PM EST, Mon December 17, 2012
+ + +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+

Newtown begins saying goodbyes

+

+

+
+A day after President Obama told a packed auditorium in Newtown that he would use "whatever power" he has to prevent more tragedies, the first funerals for the 20 children killed will be held. FULL STORY +
+
+
+ + +
+

+ +
+
+
+
+
+ +
+
+
+
+
+ +
+ +
+ +
+
+
+
+
+ +
+ + + + + +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+CNN TV live all day from Newtown +
+
Latest massacre updates
+
+
+
+
+
+
+
+
+
+
+'OutFront': Hearing from her friends +
+
Remembering Nancy Lanza
+
+
+
+
+
+
+
+
+
+
+'AC360' looks back at her life +
+
6-year-old Newtown victim
+
+
+
+
+
+
+
+
+
+
+A new perspective on 'Starting Point' +
+
Mind of young shooter
+
+
+
+
+
+
+
+
+
+
+Piers Morgan and guests weigh in +
+
Gun control debate
+
+
+
+
+
+
+
+
+
+
+Be part of Piers Morgan audience Wed. +
+
Town hall after tragedy
+
+
+
+
+
+
+
+
+
+
+'AC360' has the emotional interview +
+
Principal's family speaks
+
+
+
+
+
+
+
+
+
+
+'Piers Morgan Tonight' tribute +
+
Remembering young victims
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+ +
+
+
+

Business

+
+
+ +
+
More
+
+
+
+
+ +
+
+
+

Popular on Facebook

+
+
+
    + + + +
+ +
+
+
+
+
+
+
+
+
+ + + +
+ + +
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+ + + +
+ +
+

Quick vote

+ + +
+
+ +
Do you own a gun?
+
+
    +
  • + +
  • + +
+
+ +
+
+ +
+
+
+
+ + + +
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+
    +
  • CNN Radio
  • +
  • HLN
  • +
  • Full Schedule
  • +
  • +
    + +
    +
  • +
+

Must Watch TV

+
    +
  1. SoledadStarting Point
    7am ET / 4am PT on CNN
  2. +
  3. The Situation RoomThe Situation Room
    4pm ET / 1pm PT on CNN
  4. +
  5. Erin Burnett: OutFrontErin Burnett: OutFront
    7pm ET / 4pm PT on CNN
  6. +
  7. AC 360AC 360
    8pm ET/PT on CNN
  8. +
  9. Piers Morgan TonightPiers Morgan Tonight
    9pm ET/PT on CNN
  10. +
+ +

Trending Video

+ + +
+
+
+
+
+ + +
+ +
ADVERTISEMENT
+ + + +
+ + + + + + + +
ADVERTISEMENT
+ +
ADVERTISEMENT
+ + + + + + + + + +
+ + + From 12c9219d671c672fedcf9e9ab7f9187b23b8f7f4 Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Mon, 17 Dec 2012 22:44:54 +0200 Subject: [PATCH 793/849] Fix some warnigns in recent perls. All existing tests pass. --- IkiWiki/Plugin/git.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm index 0c0e27521..3879abeae 100644 --- a/IkiWiki/Plugin/git.pm +++ b/IkiWiki/Plugin/git.pm @@ -341,8 +341,8 @@ sub parse_diff_tree ($) { my $dt_ref = shift; # End of stream? - return if !defined @{ $dt_ref } || - !defined @{ $dt_ref }[0] || !length @{ $dt_ref }[0]; + return if ! @{ $dt_ref } || + !defined $dt_ref->[0] || !length $dt_ref->[0]; my %ci; # Header line. From 88d7896494c030131fe19d8a05b63af3d4b181bb Mon Sep 17 00:00:00 2001 From: "http://smcv.pseudorandom.co.uk/" Date: Tue, 18 Dec 2012 04:27:14 -0400 Subject: [PATCH 794/849] This reverts commit a877cc5d4caeab4f6f369fd1f1aa7520edb7e05f --- doc/examples/blog/posts/test.html | 1405 ----------------------------- 1 file changed, 1405 deletions(-) delete mode 100644 doc/examples/blog/posts/test.html diff --git a/doc/examples/blog/posts/test.html b/doc/examples/blog/posts/test.html deleted file mode 100644 index 6edc04738..000000000 --- a/doc/examples/blog/posts/test.html +++ /dev/null @@ -1,1405 +0,0 @@ - - - -CNN.com - Breaking News, U.S., World, Weather, Entertainment & Video News - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
-
- -
- -
-
- -
-
-
updated 12:12 PM EST, Mon December 17, 2012
- - -
-
-
- -
-
-
-
-
- -
-
-
- -
-

Newtown begins saying goodbyes

-

-

-
-A day after President Obama told a packed auditorium in Newtown that he would use "whatever power" he has to prevent more tragedies, the first funerals for the 20 children killed will be held. FULL STORY -
-
-
- - -
-

- -
-
-
-
-
- -
-
-
-
-
- -
- -
- -
-
-
-
-
- -
- - - - - -
- -
-
-
-
-
-
-
-
- - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-CNN TV live all day from Newtown -
-
Latest massacre updates
-
-
-
-
-
-
-
-
-
-
-'OutFront': Hearing from her friends -
-
Remembering Nancy Lanza
-
-
-
-
-
-
-
-
-
-
-'AC360' looks back at her life -
-
6-year-old Newtown victim
-
-
-
-
-
-
-
-
-
-
-A new perspective on 'Starting Point' -
-
Mind of young shooter
-
-
-
-
-
-
-
-
-
-
-Piers Morgan and guests weigh in -
-
Gun control debate
-
-
-
-
-
-
-
-
-
-
-Be part of Piers Morgan audience Wed. -
-
Town hall after tragedy
-
-
-
-
-
-
-
-
-
-
-'AC360' has the emotional interview -
-
Principal's family speaks
-
-
-
-
-
-
-
-
-
-
-'Piers Morgan Tonight' tribute -
-
Remembering young victims
-
-
-
-
-
-
-
-
-
-
-
- -
-
- -
-
- -
-
- -
- -
-
-
-
- -
-
- -
-
-
-
-
-
-
-
-
-
-
- - - - -
-
-
-
- -
-
-
-

Business

-
-
- -
-
More
-
-
-
-
- -
-
-
-

Popular on Facebook

-
-
-
    - - - -
- -
-
-
-
-
-
-
-
-
- - - -
- - -
-
-
-
-
-
- - - -
-
-
-
-
-
-
- - - -
- -
-

Quick vote

- - -
-
- -
Do you own a gun?
-
-
    -
  • - -
  • - -
-
- -
-
- -
-
-
-
- - - -
-
-
-
-
-
-
-
-
- -
-
- - -
-
-
    -
  • CNN Radio
  • -
  • HLN
  • -
  • Full Schedule
  • -
  • -
    - -
    -
  • -
-

Must Watch TV

-
    -
  1. SoledadStarting Point
    7am ET / 4am PT on CNN
  2. -
  3. The Situation RoomThe Situation Room
    4pm ET / 1pm PT on CNN
  4. -
  5. Erin Burnett: OutFrontErin Burnett: OutFront
    7pm ET / 4pm PT on CNN
  6. -
  7. AC 360AC 360
    8pm ET/PT on CNN
  8. -
  9. Piers Morgan TonightPiers Morgan Tonight
    9pm ET/PT on CNN
  10. -
- -

Trending Video

- - -
-
-
-
-
- - -
- -
ADVERTISEMENT
- - - -
- - - - - - - -
ADVERTISEMENT
- -
ADVERTISEMENT
- - - - - - - - - -
- - - From 5e202a079cda8ee84dd44be906d2912ecd7c6e7a Mon Sep 17 00:00:00 2001 From: "http://mildred.fr/" Date: Tue, 18 Dec 2012 10:12:31 -0400 Subject: [PATCH 795/849] Added a comment: git-annex --- .../comment_1_df8a9f4249af435cc335f77768a3278d._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/ikiwiki_and_big_files/comment_1_df8a9f4249af435cc335f77768a3278d._comment diff --git a/doc/forum/ikiwiki_and_big_files/comment_1_df8a9f4249af435cc335f77768a3278d._comment b/doc/forum/ikiwiki_and_big_files/comment_1_df8a9f4249af435cc335f77768a3278d._comment new file mode 100644 index 000000000..4ab5b52ee --- /dev/null +++ b/doc/forum/ikiwiki_and_big_files/comment_1_df8a9f4249af435cc335f77768a3278d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://mildred.fr/" + ip="2a01:e35:2f7b:8350:8d29:c70d:c3e:d110" + subject="git-annex" + date="2012-12-18T14:12:31Z" + content=""" +I suppose we could use git-annex to do that. The question is: does the Git plugin in ikiwiki supports git-annex ? I'd hope so. +"""]] From 8308d0d5563cd659ac82344224258245a4d76084 Mon Sep 17 00:00:00 2001 From: Theo Date: Tue, 18 Dec 2012 10:46:14 -0400 Subject: [PATCH 796/849] Added some hint for users --- doc/plugins/theme.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/plugins/theme.mdwn b/doc/plugins/theme.mdwn index d74784ac2..5261df111 100644 --- a/doc/plugins/theme.mdwn +++ b/doc/plugins/theme.mdwn @@ -8,7 +8,7 @@ inside `/usr/share/ikiwiki/themes/`. See [[themes]] for an overview of the themes included in ikiwiki and the [[theme market]] for third party themes. You can set the theme via the **theme** option in your config file (after -enabling the plugin). Refresh the wiki after changing it to see the changes. +enabling the plugin). Refresh the wiki (with `ikiwiki -setup `, `--setup` won't work, they are not interchangable) after changing it to see the changes. Hints for theme builders ------------------------ From 828d991dcd52468afb13e4183e3cceb8d59bf72d Mon Sep 17 00:00:00 2001 From: Theo Date: Tue, 18 Dec 2012 10:53:31 -0400 Subject: [PATCH 797/849] --- doc/setup.mdwn | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/setup.mdwn b/doc/setup.mdwn index ce51faa6d..3f6c168af 100644 --- a/doc/setup.mdwn +++ b/doc/setup.mdwn @@ -143,3 +143,7 @@ setup file. Add yourself to [[IkiWikiUsers]]. And check out the [[tips]] to find out how to get more out of ikiwiki. + +---- + +_Note: If you are searching for the file where the users are stored, it's in `your_repository/.ikiwiki/userdb`. The one which is in YOUR REPOSITORY, it cannot be found into your ~/.ikiwiki._ From b84fa3a254649ac0f1581488ae50aada9f0a93f4 Mon Sep 17 00:00:00 2001 From: Theo Date: Tue, 18 Dec 2012 10:54:01 -0400 Subject: [PATCH 798/849] --- doc/setup.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/setup.mdwn b/doc/setup.mdwn index 3f6c168af..c05093f67 100644 --- a/doc/setup.mdwn +++ b/doc/setup.mdwn @@ -146,4 +146,4 @@ the [[tips]] to find out how to get more out of ikiwiki. ---- -_Note: If you are searching for the file where the users are stored, it's in `your_repository/.ikiwiki/userdb`. The one which is in YOUR REPOSITORY, it cannot be found into your ~/.ikiwiki._ +_Note: If you are searching for the file where the users are stored, it's in `your_repository/.ikiwiki/userdb`. The one which is in YOUR REPOSITORY, it cannot be found into your `~/.ikiwiki`._ From 4638aff119e1b5a959cc02fdc8dbe6f8728c7f48 Mon Sep 17 00:00:00 2001 From: "http://mildred.fr/" Date: Tue, 18 Dec 2012 11:42:25 -0400 Subject: [PATCH 799/849] --- ..._to_set_up_git_repository_hook___63__.mdwn | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 doc/forum/How_to_set_up_git_repository_hook___63__.mdwn diff --git a/doc/forum/How_to_set_up_git_repository_hook___63__.mdwn b/doc/forum/How_to_set_up_git_repository_hook___63__.mdwn new file mode 100644 index 000000000..34bc4ace2 --- /dev/null +++ b/doc/forum/How_to_set_up_git_repository_hook___63__.mdwn @@ -0,0 +1,19 @@ +Hi, + +I want to set up hooks for Git, and I don't know how to. Is there any documentation somewhere? Basically, I'd like to do what [[/ikiwiki-makerepo]] does, but manually. + +Why? Because I want to have a special layout to my repository. Especially, I want to include at the root level some special files: + +- the nginx configuration +- the script that installs the nginx configuration to the system +- the script that starts the fast-cgi wrapper +- the `ikiwiki.setup` file +- ... + +And I want the ikiwiki sources to be in a subdirectory `src/` and the generated files in `out/` (where the nginx configuration points). + +So, what is the special `post-update` hook generated by [[/ikiwiki-makerepo]]? I noticed it was an ELF file, why not a script? What does it do? + +Thanks, + +Mildred From 7f534f034840993fd3ea0d9d67ca79ad3d8e5b7e Mon Sep 17 00:00:00 2001 From: Theo Date: Tue, 18 Dec 2012 12:16:53 -0400 Subject: [PATCH 800/849] Added debian package names, so people won't assume the dependencies will be resolved when installing `xapian-omega` --- doc/plugins/search.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/plugins/search.mdwn b/doc/plugins/search.mdwn index e95739cf3..f116649c1 100644 --- a/doc/plugins/search.mdwn +++ b/doc/plugins/search.mdwn @@ -5,7 +5,7 @@ This plugin adds full text search to ikiwiki, using the [xapian](http://xapian.org/) engine, its [omega](http://xapian.org/docs/omega/overview.html) frontend, and the [[!cpan Search::Xapian]], [[!cpan Digest::SHA]], and [[!cpan HTML::Scrubber]] -perl modules. +perl modules (on debian, check that you have packages `libsearch-xapian-perl`, `libdigest-sha-perl` and `libhtml-scrubber-perl` installed). The [[ikiwiki/searching]] page describes how to write search queries. From 130fd91a6926990ba8fc3a132a81e55c61d16270 Mon Sep 17 00:00:00 2001 From: Theo Date: Tue, 18 Dec 2012 12:41:45 -0400 Subject: [PATCH 801/849] Added some warning. --- doc/setup.mdwn | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/setup.mdwn b/doc/setup.mdwn index c05093f67..bdbe323fd 100644 --- a/doc/setup.mdwn +++ b/doc/setup.mdwn @@ -146,4 +146,7 @@ the [[tips]] to find out how to get more out of ikiwiki. ---- -_Note: If you are searching for the file where the users are stored, it's in `your_repository/.ikiwiki/userdb`. The one which is in YOUR REPOSITORY, it cannot be found into your `~/.ikiwiki`._ +_Notes_: + +- If you are searching for the file where the users are stored, it's in `your_repository/.ikiwiki/userdb`. The one which is in YOUR REPOSITORY, it cannot be found into your `~/.ikiwiki`. +- If you want to enable a plugin you **WILL HAVE** to add it to the `add_plugins` array in the `*.setup` file (or to use the `--plugin` switch while calling `ikiwiki`). Uncommenting the plugin options/configuration fields in the setup is not **ALWAYS** sufficient. You have been warned. From 30393190353f9c3eaedf40df98bc7946737ea35a Mon Sep 17 00:00:00 2001 From: Franek Date: Thu, 20 Dec 2012 18:09:41 -0400 Subject: [PATCH 802/849] --- doc/plugins/contrib/localfavicon.mdwn | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/plugins/contrib/localfavicon.mdwn b/doc/plugins/contrib/localfavicon.mdwn index 49347ce09..66c9fdf5c 100644 --- a/doc/plugins/contrib/localfavicon.mdwn +++ b/doc/plugins/contrib/localfavicon.mdwn @@ -1,6 +1,3 @@ -**Note: This plugin does not seem to be working presently.** - - [[!template id=plugin name=localfavicon author="Franek"]] This is a trivial modification of the [[plugins/favicon]] plugin to allow different favicons for different parts of the site. For this, the option "localfavicon" has to be set to 1 in the setup file, otherwise the plugin behaves just like the favicon plugin. From 10556fa8d02f7510e3a68d049e4357bf324e1e77 Mon Sep 17 00:00:00 2001 From: Franek Date: Thu, 20 Dec 2012 18:10:13 -0400 Subject: [PATCH 803/849] removed --- .../comment_3_afa5539a5f8aa52cb81c15bfa8d4ecda._comment | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 doc/forum/Can_I_have_different_favicons_for_each_folder__63__/comment_3_afa5539a5f8aa52cb81c15bfa8d4ecda._comment diff --git a/doc/forum/Can_I_have_different_favicons_for_each_folder__63__/comment_3_afa5539a5f8aa52cb81c15bfa8d4ecda._comment b/doc/forum/Can_I_have_different_favicons_for_each_folder__63__/comment_3_afa5539a5f8aa52cb81c15bfa8d4ecda._comment deleted file mode 100644 index 403a6dad5..000000000 --- a/doc/forum/Can_I_have_different_favicons_for_each_folder__63__/comment_3_afa5539a5f8aa52cb81c15bfa8d4ecda._comment +++ /dev/null @@ -1,8 +0,0 @@ -[[!comment format=mdwn - username="Franek" - ip="88.65.126.36" - subject="comment 3" - date="2012-12-17T01:31:50Z" - content=""" -I just noticed that my localfavicon plugin does not work anymore (for me, at least). Don't know why yet. -"""]] From 080a52977c9ca7964d075bb2e2388bdc006780ea Mon Sep 17 00:00:00 2001 From: "http://smcv.pseudorandom.co.uk/" Date: Fri, 21 Dec 2012 07:02:19 -0400 Subject: [PATCH 804/849] Added a comment --- ..._2d996f1124aedc10f345139c3d8b11df._comment | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 doc/forum/ikiwiki_and_big_files/comment_2_2d996f1124aedc10f345139c3d8b11df._comment diff --git a/doc/forum/ikiwiki_and_big_files/comment_2_2d996f1124aedc10f345139c3d8b11df._comment b/doc/forum/ikiwiki_and_big_files/comment_2_2d996f1124aedc10f345139c3d8b11df._comment new file mode 100644 index 000000000..6a11d9ae2 --- /dev/null +++ b/doc/forum/ikiwiki_and_big_files/comment_2_2d996f1124aedc10f345139c3d8b11df._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://smcv.pseudorandom.co.uk/" + nickname="smcv" + subject="comment 2" + date="2012-12-21T11:02:19Z" + content=""" +Unfortunately, ikiwiki [[doesn't follow symlinks for security +reasons|security]] - if it did, anyone who can commit to the wiki +repository could publish any file readable by the user who runs ikiwiki, +including secrets like `~/.gnupg/secring.gpg` or +`~/.ssh/identity`. + +git-annex relies on symlinks, so that restriction breaks it. +It would be great to be able to use some restricted, safe subset +of symlinks (\"relative symlinks that point into `.git/annex`\" would +be enough to support git-annex), and I've looked into it in the past. +My [[plugins/contrib/album]] plugin would benefit from being able +to annex the actual photos, for instance. +"""]] From 695945b0c765f8145a0845ed744dd463bd0e22ab Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Fri, 21 Dec 2012 10:49:13 -0400 Subject: [PATCH 805/849] Added a comment --- .../comment_3_dfbd38e2b457ea3c4f70266dbf8fbeab._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/ikiwiki_and_big_files/comment_3_dfbd38e2b457ea3c4f70266dbf8fbeab._comment diff --git a/doc/forum/ikiwiki_and_big_files/comment_3_dfbd38e2b457ea3c4f70266dbf8fbeab._comment b/doc/forum/ikiwiki_and_big_files/comment_3_dfbd38e2b457ea3c4f70266dbf8fbeab._comment new file mode 100644 index 000000000..6aae6dbd7 --- /dev/null +++ b/doc/forum/ikiwiki_and_big_files/comment_3_dfbd38e2b457ea3c4f70266dbf8fbeab._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 3" + date="2012-12-21T14:49:13Z" + content=""" +git-annex is gaining a new \"direct\" mode where it does not use symlinks. It remains to be seen if enough git operations will be supported in that mode to make it attractive to use. +"""]] From bae3d0d01fb914ba046da4df3c498f44e41ef750 Mon Sep 17 00:00:00 2001 From: Franek Date: Fri, 21 Dec 2012 12:35:05 -0400 Subject: [PATCH 806/849] --- ...__39__t_create_po_files___40__only_pot__41__..mdwn | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/forum/po_plugin_doesn__39__t_create_po_files___40__only_pot__41__..mdwn diff --git a/doc/forum/po_plugin_doesn__39__t_create_po_files___40__only_pot__41__..mdwn b/doc/forum/po_plugin_doesn__39__t_create_po_files___40__only_pot__41__..mdwn new file mode 100644 index 000000000..95cb62d29 --- /dev/null +++ b/doc/forum/po_plugin_doesn__39__t_create_po_files___40__only_pot__41__..mdwn @@ -0,0 +1,11 @@ +On [[the po plugin's page|plugins/po]] it is clearly stated that "when the plugin has just been enabled, or when a page has just been declared as being translatable, the needed POT and PO files are created". Yet on all my attempts, only the pot file was created. Do I have to create the po files manually somehow? + +To be precise, these are the settings I put in my wiki's setup file to enable the po plugin: + + add_plugins => [qw{... po ...}], + po_master_language => 'de|Deutsch', + po_slave_languages => 'en|English', + po_translatable_pages => "mytranslatedpage", + po_link_to => 'current', + +… followed by "ikiwiki --setup mysetupfile". From 3d6ee9eccd6848d5ce66dd11c53f20c01083fb84 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 22 Dec 2012 16:15:38 -0400 Subject: [PATCH 807/849] htmlscrubber: Allow the bitcoin URI scheme. --- IkiWiki/Plugin/htmlscrubber.pm | 2 +- debian/changelog | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/IkiWiki/Plugin/htmlscrubber.pm b/IkiWiki/Plugin/htmlscrubber.pm index a58a27d52..b22d3aa9e 100644 --- a/IkiWiki/Plugin/htmlscrubber.pm +++ b/IkiWiki/Plugin/htmlscrubber.pm @@ -28,7 +28,7 @@ sub import { "aim", "callto", "cvs", "ed2k", "feed", "fish", "gg", "irc", "ircs", "lastfm", "ldaps", "magnet", "mms", "msnim", "notes", "rsync", "secondlife", "skype", "ssh", - "sftp", "smb", "sms", "snews", "webcal", "ymsgr", + "sftp", "smb", "sms", "snews", "webcal", "ymsgr", "bitcoin" ); # data is a special case. Allow a few data:image/ types, # but disallow data:text/javascript and everything else. diff --git a/debian/changelog b/debian/changelog index 51ce353d5..abc40a163 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +ikiwiki (3.20121213) UNRELEASED; urgency=low + + * htmlscrubber: Allow the bitcoin URI scheme. + + -- Joey Hess Sat, 22 Dec 2012 16:15:24 -0400 + ikiwiki (3.20121212) unstable; urgency=low * filecheck: Fix bug that prevented File::MimeInfo::Magic from ever From b2ff098ae992f6b9e5d4b75d47b7ffa85d07d119 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlid724BsrBWNuXsq89yVU5fYj1RfDnfsQ" Date: Sat, 22 Dec 2012 18:27:18 -0400 Subject: [PATCH 808/849] --- doc/sandbox.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index fee5f7da9..6f1fef91e 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -1 +1,3 @@ +## HELP + $2 + 2 = 4$ From dc05125b0bdd7c579e36203ce2b16c86f6d8092f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 27 Dec 2012 21:25:59 -0400 Subject: [PATCH 809/849] aggregate: When run with --aggregate, if an aggregation is already running, don't go on and --refresh. This way, if a previous aggregation job is running, we don't add additional load doing work that job will do anyway. --- IkiWiki/Plugin/aggregate.pm | 3 +-- debian/changelog | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/IkiWiki/Plugin/aggregate.pm b/IkiWiki/Plugin/aggregate.pm index 83bd670cb..89da5c453 100644 --- a/IkiWiki/Plugin/aggregate.pm +++ b/IkiWiki/Plugin/aggregate.pm @@ -113,8 +113,7 @@ sub launchaggregation () { my @feeds=needsaggregate(); return unless @feeds; if (! lockaggregate()) { - debug("an aggregation process is already running"); - return; + error("an aggregation process is already running"); } # force a later rebuild of source pages $IkiWiki::forcerebuild{$_->{sourcepage}}=1 diff --git a/debian/changelog b/debian/changelog index abc40a163..6f13b2dd5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,8 @@ ikiwiki (3.20121213) UNRELEASED; urgency=low * htmlscrubber: Allow the bitcoin URI scheme. + * aggregate: When run with --aggregate, if an aggregation is already + running, don't go on and --refresh. -- Joey Hess Sat, 22 Dec 2012 16:15:24 -0400 From 86519b047e6fb96e4c5c5b22cb9619d120bf566e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 27 Dec 2012 22:29:51 -0400 Subject: [PATCH 810/849] trail: Converted all dependencies to presence dependencies. smcv please note this introduces another bug, which I've opened --- IkiWiki/Plugin/trail.pm | 6 +++--- debian/changelog | 1 + doc/bugs/trail_excess_dependencies.mdwn | 26 +++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 doc/bugs/trail_excess_dependencies.mdwn diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index 7d2338f9b..cf0f0a15e 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -318,7 +318,7 @@ sub prerender { $prev = $members->[$i - 1] if $i > 0; my $next = $members->[$i + 1]; - add_depends($member, $trail); + add_depends($member, $trail, deptype("presence")); $member_to_trails{$member}{$trail} = [$prev, $next]; } @@ -406,13 +406,13 @@ sub pagetemplate (@) { my ($prevurl, $nexturl, $prevtitle, $nexttitle); if (defined $prev) { - add_depends($params{destpage}, $prev); + add_depends($params{destpage}, $prev, deptype("presence")); $prevurl = urlto($prev, $page); $prevtitle = title_of($prev); } if (defined $next) { - add_depends($params{destpage}, $next); + add_depends($params{destpage}, $next, deptype("presence")); $nexturl = urlto($next, $page); $nexttitle = title_of($next); } diff --git a/debian/changelog b/debian/changelog index 6f13b2dd5..948fdcc84 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,7 @@ ikiwiki (3.20121213) UNRELEASED; urgency=low * htmlscrubber: Allow the bitcoin URI scheme. * aggregate: When run with --aggregate, if an aggregation is already running, don't go on and --refresh. + * trail: Converted all dependencies to presence dependencies. -- Joey Hess Sat, 22 Dec 2012 16:15:24 -0400 diff --git a/doc/bugs/trail_excess_dependencies.mdwn b/doc/bugs/trail_excess_dependencies.mdwn new file mode 100644 index 000000000..d5dcd5403 --- /dev/null +++ b/doc/bugs/trail_excess_dependencies.mdwn @@ -0,0 +1,26 @@ +I've just modified the trail plugin to use only presence, and not +content dependencies. Using content dependencies, particularly to the page +that defines the trail, meant that every time that page changed, *every* +page in the trail gets rebuilt. This leads to users setting up sites that +have horrible performance, if the trail is defined in, for example, the top +page of a blog. + +Unfortunatly, this change to presence dependencies has +introduced a bug. Now when an existing trail is removed, the pages in the +trail don't get rebuilt to remove the trail (both html display and state). + +I think that to fix this bug, the plugin should use a hook to +force rebuilding of all the pages that were in the trail, when +the trail is removed (or changed). + +There's a difficulty in doing that: The needsbuild hook runs before the scan +hook, so before it has a chance to see if the trail directive is still there. +It'd need some changes to ikiwiki's hooks. + +(An improvement in this area would probably simplify other plugins, which +currently abuse the needsbuild hook to unset state, to handle the case +where the directive that resulted in that state is removed.) + +I apologise for introducing a known bug, but the dependency mess was too +bad to leave as-is. And I have very little time (and regrettably, even less +power) to deal with it right now. :( --[[Joey]] From b320aa69af62e219e6bfcc72f148d722671bf6c8 Mon Sep 17 00:00:00 2001 From: "http://mildred.fr/" Date: Fri, 28 Dec 2012 06:01:19 -0400 Subject: [PATCH 811/849] --- doc/todo/inline_directive_should_support_pagination.mdwn | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/todo/inline_directive_should_support_pagination.mdwn diff --git a/doc/todo/inline_directive_should_support_pagination.mdwn b/doc/todo/inline_directive_should_support_pagination.mdwn new file mode 100644 index 000000000..eafe6ee11 --- /dev/null +++ b/doc/todo/inline_directive_should_support_pagination.mdwn @@ -0,0 +1,8 @@ +Ikiwiki should support pagination for index pages. Something like showing only 10 items on the first page, and then having the other items on the other pages. + +Basically, the same page would be rendered multiple times: + +- The index page: rendered normally, but item list is truncated to N items +- The separate pages: rendered with a slice of the item list containing N items (or less for the last page) + +This I think breaks one major assumption: that source pages only generate one page in the output directory. From 3f6985ec7186896058364b94a2e9f686f72dfd85 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmlpKnpngEkdsJuNKGwky02g5qSpdMNY7c" Date: Sat, 29 Dec 2012 10:24:28 -0400 Subject: [PATCH 812/849] --- doc/tips/Make_calendar_start_week_on_Monday/discussion.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/tips/Make_calendar_start_week_on_Monday/discussion.mdwn diff --git a/doc/tips/Make_calendar_start_week_on_Monday/discussion.mdwn b/doc/tips/Make_calendar_start_week_on_Monday/discussion.mdwn new file mode 100644 index 000000000..fffd587d8 --- /dev/null +++ b/doc/tips/Make_calendar_start_week_on_Monday/discussion.mdwn @@ -0,0 +1 @@ +It should be pointed out that copying the templates are optional -- you only have to add **week_start_day="1"** to the calendar part of the sidebar. From f2e8e05c9e1bd0ee8a9963508a15c5455b90bf91 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlRjjrKEyPmXnh2qBEGx9PgH5DP32wCMAQ" Date: Wed, 2 Jan 2013 01:04:45 -0400 Subject: [PATCH 813/849] --- ...eName_failed_to_return_the_uploaded_file_name.mdwn | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name.mdwn diff --git a/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name.mdwn b/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name.mdwn new file mode 100644 index 000000000..ad52c0091 --- /dev/null +++ b/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name.mdwn @@ -0,0 +1,11 @@ +I tried to upload a file to my wiki last week, and got this error: + + Error: CGI::tmpFileName failed to return the uploaded file name + +This used to work, and I honestly don't know what could have changed to screw it up. + +I see that there's a lot of frustrated comments around this particular block of code in `attachment.pm`; so, for the record, I'm on Debian 6, using perl `5.10.1-17squeeze4`. + +Any thoughts? + +~jonathon From ad26978d5acec2103c5da5c89dcb86f044ce499e Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlRjjrKEyPmXnh2qBEGx9PgH5DP32wCMAQ" Date: Wed, 2 Jan 2013 10:59:20 -0400 Subject: [PATCH 814/849] Added a comment: ikiwiki version --- .../comment_1_66c321b9eb618d20872cee7d6ca9e44c._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_1_66c321b9eb618d20872cee7d6ca9e44c._comment diff --git a/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_1_66c321b9eb618d20872cee7d6ca9e44c._comment b/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_1_66c321b9eb618d20872cee7d6ca9e44c._comment new file mode 100644 index 000000000..fb499004e --- /dev/null +++ b/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_1_66c321b9eb618d20872cee7d6ca9e44c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlRjjrKEyPmXnh2qBEGx9PgH5DP32wCMAQ" + nickname="Jonathon" + subject="ikiwiki version" + date="2013-01-02T14:59:19Z" + content=""" +I should also identify that I'm using ikiwiki `3.20100815.9`. +"""]] From bd40b1e63598bb8a4fbf01818cc8ca498aa27ac9 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawn2JnuuGJ5HXOGUfY036CabMkOilQi0prI" Date: Wed, 2 Jan 2013 12:50:08 -0400 Subject: [PATCH 815/849] --- doc/sandbox.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index 6f1fef91e..783080f5c 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -1,3 +1,5 @@ ## HELP $2 + 2 = 4$ + +blah blah From 587f4cc83333ec7df3a71f074a1be10eb93e89c2 Mon Sep 17 00:00:00 2001 From: "http://smcv.pseudorandom.co.uk/" Date: Wed, 2 Jan 2013 13:22:53 -0400 Subject: [PATCH 816/849] some analysis --- doc/bugs/trail_excess_dependencies.mdwn | 56 +++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/doc/bugs/trail_excess_dependencies.mdwn b/doc/bugs/trail_excess_dependencies.mdwn index d5dcd5403..b72adaf42 100644 --- a/doc/bugs/trail_excess_dependencies.mdwn +++ b/doc/bugs/trail_excess_dependencies.mdwn @@ -9,14 +9,38 @@ Unfortunatly, this change to presence dependencies has introduced a bug. Now when an existing trail is removed, the pages in the trail don't get rebuilt to remove the trail (both html display and state). +> Actually, this particular case is usually OK. Suppose a trail `untrail` +> contains `untrail/a` (as is the case in the regression +> test I'm writing), and you build the wiki, then edit `untrail` to no +> longer be a trail, and refresh. `untrail` has changed, so it is +> rendered. Assuming that the template of either `untrail` or another +> changed page happens to contain the `TRAILS` variable (which is not +> guaranteed, but is highly likely), `I::P::t::prerender` +> is invoked. It notices that `untrail/a` was previously a trail +> member and is no longer, and rebuilds it with the diagnostic +> "building untrail/a, its previous or next page has changed". +> +> Strictly speaking, I should change `I::P::t::build_affected` +> so it calls `prerender`, so we're guaranteed to have done the +> recalculation. I'll do that. --[[smcv]] + I think that to fix this bug, the plugin should use a hook to force rebuilding of all the pages that were in the trail, when the trail is removed (or changed). +> The case of "the trail is changed" is still broken: +> if the order of items changes, or the trail is removed, +> then the logic above means it's OK, but if you +> change the `\[[!meta title]]` of the trail, or anything else +> used in the prev/up/next bar, the items won't show that +> change. --[[smcv]] + There's a difficulty in doing that: The needsbuild hook runs before the scan hook, so before it has a chance to see if the trail directive is still there. It'd need some changes to ikiwiki's hooks. +> `build_affected` can fix this, I think. --[[smcv]] + (An improvement in this area would probably simplify other plugins, which currently abuse the needsbuild hook to unset state, to handle the case where the directive that resulted in that state is removed.) @@ -24,3 +48,35 @@ where the directive that resulted in that state is removed.) I apologise for introducing a known bug, but the dependency mess was too bad to leave as-is. And I have very little time (and regrettably, even less power) to deal with it right now. :( --[[Joey]] + +> Here is an analysis of how the trail pages interdepend. +> +> * If *trail* contains a page *member* which does exist, *member* depends +> on *trail*. This is so that if the trail directive is deleted from +> *trail*, or if *trail*'s "friendly" title or trail settings are changed, +> the trail navigation bar in *member* will pick up that change. This is +> now only a presence dependency, which isn't enough to make those happen +> correctly. +> +> * If *trail* contains consecutive pages *m1* and *m2* in that order, +> *m1* and *m2* depend on each other. This is so that if one's +> "friendly" title changes, the other is rebuilt. This is now only +> a presence dependency, which isn't enough to make those happen +> correctly. +> +> * If *trail* has *member* in its `pagenames` but there is no page called +> *member*, then *trail* must be rebuilt if *member* is created. This +> was always a presence dependency, and is fine. +> +> In addition, the `trail` plugin remembers the maps +> { trail => next item in that trail } and { trail => previous item in +> that trail } for each page. If either changes, the page gets rebuilt +> by `build_affected`, with almost the same logic as is used to update +> pages that link to a changed page. +> +> I think it's true to say that the trail always depends on every member, +> even if it doesn't display them. This might mean that we can use +> "render the trail page" as an opportunity to work out whether any of +> its members are also going to need re-rendering? +> +> --[[smcv]] From 6e962a2d747bd8a8bbbdfc5b8eaeb689100c0b1c Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 2 Jan 2013 18:05:33 +0000 Subject: [PATCH 817/849] opendiscussion: don't allow editing discussionpage if discussion is disabled --- IkiWiki/Plugin/opendiscussion.pm | 2 +- .../opendiscussion_should_respect_the_discussion_option.mdwn | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/IkiWiki/Plugin/opendiscussion.pm b/IkiWiki/Plugin/opendiscussion.pm index 2805f60ef..808d3cd2b 100644 --- a/IkiWiki/Plugin/opendiscussion.pm +++ b/IkiWiki/Plugin/opendiscussion.pm @@ -25,7 +25,7 @@ sub canedit ($$) { my $cgi=shift; my $session=shift; - return "" if $page=~/(\/|^)\Q$config{discussionpage}\E$/i; + return "" if $config{discussion} && $page=~/(\/|^)\Q$config{discussionpage}\E$/i; return "" if pagespec_match($page, "postcomment(*)"); return undef; } diff --git a/doc/bugs/opendiscussion_should_respect_the_discussion_option.mdwn b/doc/bugs/opendiscussion_should_respect_the_discussion_option.mdwn index e4bc736e3..0b9ed08be 100644 --- a/doc/bugs/opendiscussion_should_respect_the_discussion_option.mdwn +++ b/doc/bugs/opendiscussion_should_respect_the_discussion_option.mdwn @@ -4,3 +4,5 @@ the `discussionpage` setting to be edited anonymously, even if (If it respected the `discussion` option, the combination of `opendiscussion` and `moderatedcomments` might be good for blogs.) + +[[done]] --[[smcv]] From 97d2c41ed48f21f0b8db0bc8e835cc1b6650a121 Mon Sep 17 00:00:00 2001 From: "http://smcv.pseudorandom.co.uk/" Date: Wed, 2 Jan 2013 14:07:42 -0400 Subject: [PATCH 818/849] +patch --- .../opendiscussion_should_respect_the_discussion_option.mdwn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/bugs/opendiscussion_should_respect_the_discussion_option.mdwn b/doc/bugs/opendiscussion_should_respect_the_discussion_option.mdwn index e4bc736e3..318f79d6a 100644 --- a/doc/bugs/opendiscussion_should_respect_the_discussion_option.mdwn +++ b/doc/bugs/opendiscussion_should_respect_the_discussion_option.mdwn @@ -1,3 +1,6 @@ +[[!template id=gitbranch branch=smcv/ready/less-open author="[[smcv]]"]] +[[!tag patch]] + The [[plugins/opendiscussion]] plugin allows pages named according to the `discussionpage` setting to be edited anonymously, even if `discussion => 0` is set. From 48664cb9336fed62d297b84ea30806fc802aa42c Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 2 Jan 2013 19:18:10 +0000 Subject: [PATCH 819/849] Ignore MYMETA.yml, generated by Makefile.PL --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index fe1c3d441..f8991a63d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ ikiwiki.out ikiwiki-transition.out ikiwiki-calendar.out pm_to_blib +/MYMETA.yml *.man /po/cover_db po/po2wiki_stamp From 1daa68b8b7a496736cc27f80c1de2bd4d97d5225 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 2 Jan 2013 17:36:17 +0000 Subject: [PATCH 820/849] trail: call prerender from build_affected In the unlikely event that the ordered contents of a trail have changed without the TRAILS or TRAILLOOP template variables being evaluated (for instance, all trail directives are removed from a former trail that uses a custom pagetemplate that doesn't contain TRAILS), we might get here without having already called prerender. --- IkiWiki/Plugin/trail.pm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index cf0f0a15e..86c94642a 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -359,6 +359,12 @@ sub prerender { sub build_affected { my %affected; + # In principle we might not have done this yet, although in practice + # at least the trail itself has probably changed, and its template + # almost certainly contains TRAILS or TRAILLOOP, triggering our + # prerender as a side-effect. + prerender(); + foreach my $member (keys %rebuild_trail_members) { $affected{$member} = sprintf(gettext("building %s, its previous or next page has changed"), $member); } From 94a51309635b799fd25aeaf60d90fab25939343e Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 2 Jan 2013 19:00:20 +0000 Subject: [PATCH 821/849] Add more trail regression tests Some of these untested bits have in fact regressed, and as such, are marked as TODO. --- t/trail.t | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/t/trail.t b/t/trail.t index 2e4b9278d..59eb0d4d6 100755 --- a/t/trail.t +++ b/t/trail.t @@ -15,11 +15,11 @@ sub check_trail { sub check_no_trail { my $file=shift; - my $trailname=shift; + my $trailname=shift || qr/\w+/; my $blob=readfile("t/tmp/out/$file"); my ($trailline)=$blob=~/^trail=$trailname\s+(.*)$/m; $trailline="" unless defined $trailline; - ok($trailline !~ /^trail=$trailname\s+/, "no $trailname in $file"); + ok($trailline !~ /^trail=$trailname\s+/, "no trail $trailname in $file"); } my $blob; @@ -96,6 +96,18 @@ write_old_file("sorting.mdwn", '[[!trailitems pagenames="sorting/beginning sorting/middle sorting/end"]] ' . '[[!inline pages="sorting/old or sorting/ancient or sorting/new" trail="yes"]] ' . '[[!traillink linked2]]'); +write_old_file("limited/a.mdwn", "a"); +write_old_file("limited/b.mdwn", "b"); +write_old_file("limited/c.mdwn", "c"); +write_old_file("limited/d.mdwn", "d"); +write_old_file("limited.mdwn", + '[[!inline pages="limited/*" trail="yes" show=2 sort=title]]'); +write_old_file("untrail/a.mdwn", "a"); +write_old_file("untrail/b.mdwn", "b"); +write_old_file("untrail.mdwn", "[[!traillink a]] [[!traillink b]]"); +write_old_file("retitled/a.mdwn", "a"); +write_old_file("retitled.mdwn", + '[[!meta title="the old title"]][[!traillink a]]'); write_old_file("meme.mdwn", <a<\/a>/m); +ok($blob =~ /b<\/a>/m); +ok($blob !~ //m); +ok($blob !~ //m); +check_trail("limited/a.html", "n=limited/b p="); +check_trail("limited/b.html", "n=limited/c p=limited/a"); +check_trail("limited/c.html", "n=limited/d p=limited/b"); +check_trail("limited/d.html", "n= p=limited/c"); + +check_trail("untrail/a.html", "n=untrail/b p="); +check_trail("untrail/b.html", "n= p=untrail/a"); + +$blob = readfile("t/tmp/out/retitled/a.html"); +ok($blob =~ /\^ the old title \^/m); + # Make some changes and refresh. These writefile calls don't set an # old mtime, so they're strictly newer than the "old" files. @@ -192,6 +222,16 @@ writefile("sorting.mdwn", "t/tmp/in", readfile("t/tmp/in/sorting.mdwn") . '[[!trailoptions sort="title" reverse="yes"]]'); +writefile("retitled.mdwn", "t/tmp/in", + '[[!meta title="the new title"]][[!traillink a]]'); + +# If the inline has a limited number of pages, the trail still depends on +# everything. +writefile("limited.html", "t/tmp/out", "[this gets rebuilt]"); +writefile("limited/c.mdwn", "t/tmp/in", '[[!meta title="New C page"]]c'); + +writefile("untrail.mdwn", "t/tmp/in", "no longer a trail"); + ok(! system("$command -refresh")); check_trail("add/a.html", "n=add/b p="); @@ -218,4 +258,41 @@ check_trail("sorting/a/b.html", "n=sorting/ancient p=sorting/beginning"); check_trail("sorting/ancient.html", "n=sorting/z/a p=sorting/a/b"); check_trail("sorting/z/a.html", "n= p=sorting/ancient"); +# If the inline has a limited number of pages, the trail still depends on +# everything, so it gets rebuilt even though it doesn't strictly need it. +# This means we could use it as a way to recompute the order of members +# and the contents of their trail navbars, allowing us to fix the regression +# described in [[bugs/trail excess dependencies]] without a full content +# dependency. +$blob = readfile("t/tmp/out/limited.html"); +ok($blob =~ /a<\/a>/m); +ok($blob =~ /b<\/a>/m); +ok($blob !~ //m); +ok($blob !~ //m); +check_trail("limited/a.html", "n=limited/b p="); +check_trail("limited/b.html", "n=limited/c p=limited/a"); +check_trail("limited/c.html", "n=limited/d p=limited/b"); +check_trail("limited/d.html", "n= p=limited/c"); +# Also, b and d should pick up the change to c. This regressed with the +# change to using a presence dependency. +TODO: { +local $TODO = "trail members don't pick up other members' title changes"; +$blob = readfile("t/tmp/out/limited/b.html"); +ok($blob =~ /New C page >/m); +$blob = readfile("t/tmp/out/limited/d.html"); +ok($blob =~ /< New C page/m); +} + +# Members of a retitled trail should pick up that change. +# This regressed with the change to using a presence dependency. +TODO: { +local $TODO = "trail members don't pick up the trail's title changes"; +$blob = readfile("t/tmp/out/retitled/a.html"); +ok($blob =~ /\^ the new title \^/m); +} + +# untrail is no longer a trail, so these are no longer in it. +check_no_trail("untrail/a.html"); +check_no_trail("untrail/b.html"); + ok(! system("rm -rf t/tmp")); From 7b06a65221ae16bf447c591dba5712c1d9f00461 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 2 Jan 2013 19:14:26 +0000 Subject: [PATCH 822/849] If the title of a trail or trail-member changes, rebuild affected pages If the title of a trail changes, each member of that trail must be rebuilt, for its prev/up/next box to reflect the new title. If the title of a member changes, its next and previous items (if any) must be rebuilt, for their prev/up/next boxes to reflect the new title. --- IkiWiki/Plugin/trail.pm | 26 ++++++++++++++++++++++++++ t/trail.t | 6 ------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index 86c94642a..b1bb6d5b5 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -62,12 +62,20 @@ sub getsetup () { }, } +# Cache of pages' old titles, so we can tell whether they changed +my %old_trail_titles; + sub needsbuild (@) { my $needsbuild=shift; + foreach my $page (keys %pagestate) { if (exists $pagestate{$page}{trail}) { if (exists $pagesources{$page} && grep { $_ eq $pagesources{$page} } @$needsbuild) { + # Remember its title, so we can know whether + # it changed. + $old_trail_titles{$page} = title_of($page); + # Remove state, it will be re-added # if the preprocessor directive is still # there during the rebuild. {item} is the @@ -78,6 +86,7 @@ sub needsbuild (@) { } } } + return $needsbuild; } @@ -230,6 +239,12 @@ sub trails_differ { if (! exists $new->{$trail}) { return 1; } + + if (exists $old_trail_titles{$trail} && + title_of($trail) ne $old_trail_titles{$trail}) { + return 1; + } + my ($old_p, $old_n) = @{$old->{$trail}}; my ($new_p, $new_n) = @{$new->{$trail}}; $old_p = "" unless defined $old_p; @@ -239,9 +254,20 @@ sub trails_differ { if ($old_p ne $new_p) { return 1; } + + if (exists $old_trail_titles{$old_p} && + title_of($old_p) ne $old_trail_titles{$old_p}) { + return 1; + } + if ($old_n ne $new_n) { return 1; } + + if (exists $old_trail_titles{$old_n} && + title_of($old_n) ne $old_trail_titles{$old_n}) { + return 1; + } } foreach my $trail (keys %$new) { diff --git a/t/trail.t b/t/trail.t index 59eb0d4d6..dce3b3c7e 100755 --- a/t/trail.t +++ b/t/trail.t @@ -275,21 +275,15 @@ check_trail("limited/c.html", "n=limited/d p=limited/b"); check_trail("limited/d.html", "n= p=limited/c"); # Also, b and d should pick up the change to c. This regressed with the # change to using a presence dependency. -TODO: { -local $TODO = "trail members don't pick up other members' title changes"; $blob = readfile("t/tmp/out/limited/b.html"); ok($blob =~ /New C page >/m); $blob = readfile("t/tmp/out/limited/d.html"); ok($blob =~ /< New C page/m); -} # Members of a retitled trail should pick up that change. # This regressed with the change to using a presence dependency. -TODO: { -local $TODO = "trail members don't pick up the trail's title changes"; $blob = readfile("t/tmp/out/retitled/a.html"); ok($blob =~ /\^ the new title \^/m); -} # untrail is no longer a trail, so these are no longer in it. check_no_trail("untrail/a.html"); From 7029f98bc735efcec08213d51bdec2c6645d682d Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 2 Jan 2013 19:17:16 +0000 Subject: [PATCH 823/849] trail: remove excess presence-dependencies Since trail members are explicitly rebuilt if the information used for their prev/up/next boxes changes, they don't need another dependency on the trail itself. (If the trail disappears, it will disappear from the member's member_to_trails entry, causing a rebuild; so the add_depends is redundant.) Similarly, since trail members are explicitly rebuilt if their next or previous item, or its title, changes, the presence dependencies on the next and previous items are redundant. --- IkiWiki/Plugin/trail.pm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index b1bb6d5b5..cb94855fd 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -344,8 +344,6 @@ sub prerender { $prev = $members->[$i - 1] if $i > 0; my $next = $members->[$i + 1]; - add_depends($member, $trail, deptype("presence")); - $member_to_trails{$member}{$trail} = [$prev, $next]; } @@ -438,13 +436,11 @@ sub pagetemplate (@) { my ($prevurl, $nexturl, $prevtitle, $nexttitle); if (defined $prev) { - add_depends($params{destpage}, $prev, deptype("presence")); $prevurl = urlto($prev, $page); $prevtitle = title_of($prev); } if (defined $next) { - add_depends($params{destpage}, $next, deptype("presence")); $nexturl = urlto($next, $page); $nexttitle = title_of($next); } From 252071a20fdb71da6faf54601d8f56a4ddb4f90f Mon Sep 17 00:00:00 2001 From: "http://smcv.pseudorandom.co.uk/" Date: Wed, 2 Jan 2013 15:28:07 -0400 Subject: [PATCH 824/849] branch to fix this --- doc/bugs/trail_excess_dependencies.mdwn | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/doc/bugs/trail_excess_dependencies.mdwn b/doc/bugs/trail_excess_dependencies.mdwn index b72adaf42..6d315796e 100644 --- a/doc/bugs/trail_excess_dependencies.mdwn +++ b/doc/bugs/trail_excess_dependencies.mdwn @@ -22,7 +22,7 @@ trail don't get rebuilt to remove the trail (both html display and state). > > Strictly speaking, I should change `I::P::t::build_affected` > so it calls `prerender`, so we're guaranteed to have done the -> recalculation. I'll do that. --[[smcv]] +> recalculation. Fixed in my branch. --[[smcv]] I think that to fix this bug, the plugin should use a hook to force rebuilding of all the pages that were in the trail, when @@ -33,13 +33,13 @@ the trail is removed (or changed). > then the logic above means it's OK, but if you > change the `\[[!meta title]]` of the trail, or anything else > used in the prev/up/next bar, the items won't show that -> change. --[[smcv]] +> change. Fixed in my branch. --[[smcv]] There's a difficulty in doing that: The needsbuild hook runs before the scan hook, so before it has a chance to see if the trail directive is still there. It'd need some changes to ikiwiki's hooks. -> `build_affected` can fix this, I think. --[[smcv]] +> That's what `build_affected` is for, and trail already used it. --s (An improvement in this area would probably simplify other plugins, which currently abuse the needsbuild hook to unset state, to handle the case @@ -49,6 +49,11 @@ I apologise for introducing a known bug, but the dependency mess was too bad to leave as-is. And I have very little time (and regrettably, even less power) to deal with it right now. :( --[[Joey]] +[[!template id=gitbranch branch=smcv/ready/trail author="[[Simon_McVittie|smcv]]"]] +[[!tag patch]] + +> I believe my `ready/trail` branch fixes this. There are regression tests. +> > Here is an analysis of how the trail pages interdepend. > > * If *trail* contains a page *member* which does exist, *member* depends @@ -56,13 +61,15 @@ power) to deal with it right now. :( --[[Joey]] > *trail*, or if *trail*'s "friendly" title or trail settings are changed, > the trail navigation bar in *member* will pick up that change. This is > now only a presence dependency, which isn't enough to make those happen -> correctly. +> correctly. [Edited to add: actually, the title is the only thing that +> can affect *member* without affecting the order of members.] > > * If *trail* contains consecutive pages *m1* and *m2* in that order, > *m1* and *m2* depend on each other. This is so that if one's > "friendly" title changes, the other is rebuilt. This is now only > a presence dependency, which isn't enough to make those happen -> correctly. +> correctly. In my branch, I explicitly track the "friendly" title +> for every page that's edited and is involved in a trail somehow. > > * If *trail* has *member* in its `pagenames` but there is no page called > *member*, then *trail* must be rebuilt if *member* is created. This @@ -72,11 +79,15 @@ power) to deal with it right now. :( --[[Joey]] > { trail => next item in that trail } and { trail => previous item in > that trail } for each page. If either changes, the page gets rebuilt > by `build_affected`, with almost the same logic as is used to update -> pages that link to a changed page. +> pages that link to a changed page. My branch extends this to track the +> "friendly title" of each page involved in a trail, either by being +> the trail itself or a member (or both). > > I think it's true to say that the trail always depends on every member, > even if it doesn't display them. This might mean that we can use > "render the trail page" as an opportunity to work out whether any of > its members are also going to need re-rendering? +> [Edited to add: actually, I didn't need this to be true, but I made the +> regression test check it anyway.] > > --[[smcv]] From 812a5a136d522107053a15fdb3e518054c44a0e1 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 2 Jan 2013 15:30:25 -0400 Subject: [PATCH 825/849] changelog --- debian/changelog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/debian/changelog b/debian/changelog index 948fdcc84..edd0f2cc1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,6 +4,8 @@ ikiwiki (3.20121213) UNRELEASED; urgency=low * aggregate: When run with --aggregate, if an aggregation is already running, don't go on and --refresh. * trail: Converted all dependencies to presence dependencies. + * opendiscussion: Don't allow editing discussion pages if discussion pages + are disabled. (smcv) -- Joey Hess Sat, 22 Dec 2012 16:15:24 -0400 From 229ca60acb0ed571c471b32cabd4c9f337a6622d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 2 Jan 2013 15:32:01 -0400 Subject: [PATCH 826/849] changelog --- debian/changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index edd0f2cc1..fdd8308b9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,7 +3,8 @@ ikiwiki (3.20121213) UNRELEASED; urgency=low * htmlscrubber: Allow the bitcoin URI scheme. * aggregate: When run with --aggregate, if an aggregation is already running, don't go on and --refresh. - * trail: Converted all dependencies to presence dependencies. + * trail: Avoid excess dependencies between pages in the trail + and the page defining the trail. Thanks, smcv. * opendiscussion: Don't allow editing discussion pages if discussion pages are disabled. (smcv) From b18d621873c1c3d07a9c0813d19fe12213a44339 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 2 Jan 2013 15:33:13 -0400 Subject: [PATCH 827/849] close --- doc/bugs/trail_excess_dependencies.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/bugs/trail_excess_dependencies.mdwn b/doc/bugs/trail_excess_dependencies.mdwn index 6d315796e..f806a62eb 100644 --- a/doc/bugs/trail_excess_dependencies.mdwn +++ b/doc/bugs/trail_excess_dependencies.mdwn @@ -91,3 +91,5 @@ power) to deal with it right now. :( --[[Joey]] > regression test check it anyway.] > > --[[smcv]] + +>>> Thanks **very** much! [[done]] --[[Joey]] From c635611232130bef9a66b7ad9734ba5f0523d4c2 Mon Sep 17 00:00:00 2001 From: JoshTriplett Date: Thu, 3 Jan 2013 14:56:07 -0400 Subject: [PATCH 828/849] --- doc/bugs/toc_displays_headings_from_sidebar.mdwn | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/bugs/toc_displays_headings_from_sidebar.mdwn diff --git a/doc/bugs/toc_displays_headings_from_sidebar.mdwn b/doc/bugs/toc_displays_headings_from_sidebar.mdwn new file mode 100644 index 000000000..469ca8a33 --- /dev/null +++ b/doc/bugs/toc_displays_headings_from_sidebar.mdwn @@ -0,0 +1,3 @@ +The [[/ikiwiki/directive/toc]] directive scrapes all headings from the page, including those in the sidebar. So, if the sidebar includes navigational headers, every page with a table of contents will display those navigational headers before the headers in that page's content. + +I'd like some way to exclude the sidebar from the table of contents. As discussed via Jabber, perhaps toc could have a config option to ignore headers inside a nav tag or a tag with id="sidebar". From 895b4dd26feac1b8b47eba1c73df83828442bedf Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlGhXE7l6sZKhPIyAMe2RSfm6Iet4JwEYY" Date: Fri, 4 Jan 2013 01:58:29 -0400 Subject: [PATCH 829/849] --- doc/plugins/notifyemail/discussion.mdwn | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/plugins/notifyemail/discussion.mdwn diff --git a/doc/plugins/notifyemail/discussion.mdwn b/doc/plugins/notifyemail/discussion.mdwn new file mode 100644 index 000000000..58ffb45a8 --- /dev/null +++ b/doc/plugins/notifyemail/discussion.mdwn @@ -0,0 +1,3 @@ +When I try to add this plugin to the setup file and run "ikiwiki --setup" I get an error: Can't locate IkiWiki/Plugin/notifyemail.pm + +All the other plugins I have installed have worked, so my setup should be ok - just this one is missing!?! From 1af78eafc0e0c91d9a98932bb55fcdc12f1106f6 Mon Sep 17 00:00:00 2001 From: test Date: Fri, 4 Jan 2013 07:15:35 -0400 Subject: [PATCH 830/849] --- doc/sandbox.mdwn | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index 783080f5c..83e40af6e 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -1,5 +1,9 @@ -## HELP +### HELP $2 + 2 = 4$ blah blah + + + + From b8072f964116320579a99042bfbfff60d7956f5e Mon Sep 17 00:00:00 2001 From: "http://smcv.pseudorandom.co.uk/" Date: Fri, 4 Jan 2013 09:04:53 -0400 Subject: [PATCH 831/849] --- doc/plugins/notifyemail/discussion.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/plugins/notifyemail/discussion.mdwn b/doc/plugins/notifyemail/discussion.mdwn index 58ffb45a8..631c680fc 100644 --- a/doc/plugins/notifyemail/discussion.mdwn +++ b/doc/plugins/notifyemail/discussion.mdwn @@ -1,3 +1,5 @@ When I try to add this plugin to the setup file and run "ikiwiki --setup" I get an error: Can't locate IkiWiki/Plugin/notifyemail.pm All the other plugins I have installed have worked, so my setup should be ok - just this one is missing!?! + +> It's new in version 3.20120419, perhaps you have an older version? --[[smcv]] From 020b97577a88b0c023b256d6d2ea7db6d44289d4 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 5 Jan 2013 14:52:10 +0000 Subject: [PATCH 832/849] clean the sandbox --- doc/sandbox.mdwn | 68 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index 83e40af6e..9234603fc 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -1,9 +1,71 @@ -### HELP +This is the [[SandBox]], a page anyone can edit to try out ikiwiki +(version [[!version ]]). -$2 + 2 = 4$ +> This is a blockquote. +> +> This is the first level of quoting. +> +> > This is a nested blockquote. +> +>> Without a space works too. +>>> to three levels +> +> Back to the first level. -blah blah +Numbered list + +1. First item. + 1. Sub item. +1. Another. +1. And another.. + 1. foo + 2. bar + 3. quz + +Bulleted list + +* item +* *item* +* item +* one + * footballs; runner; unices + * Cool ! +---- +[[!template id=note text="this is generated by the [[plugins/haiku]] plugin"]] +[[!haiku hint="sandbox play"]] +---- + +## Different sorts of links: + +* [[Features]] +* +* [[different_name_for_a_WikiLink|ikiwiki/WikiLink]] +* +* [GNU](http://www.gnu.org/) +* Joey's blog + +---- + +# header1 + +## header2 + +### header3 + +#### header4 + +##### header 5 + +**bold** + +_italic_ + +---- + +This **SandBox** is also a [[blog]]! + +[[!inline pages="sandbox/* and !*/Discussion" rootpage="sandbox" show="4" archive="yes"]] From 7173ef1b1315196903c7d05d664688cd65d324a0 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 5 Jan 2013 17:24:40 -0400 Subject: [PATCH 833/849] htmlscrubber: Allow the URI schemes of major VCS's. --- IkiWiki/Plugin/htmlscrubber.pm | 3 ++- debian/changelog | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/IkiWiki/Plugin/htmlscrubber.pm b/IkiWiki/Plugin/htmlscrubber.pm index b22d3aa9e..36c012c73 100644 --- a/IkiWiki/Plugin/htmlscrubber.pm +++ b/IkiWiki/Plugin/htmlscrubber.pm @@ -28,7 +28,8 @@ sub import { "aim", "callto", "cvs", "ed2k", "feed", "fish", "gg", "irc", "ircs", "lastfm", "ldaps", "magnet", "mms", "msnim", "notes", "rsync", "secondlife", "skype", "ssh", - "sftp", "smb", "sms", "snews", "webcal", "ymsgr", "bitcoin" + "sftp", "smb", "sms", "snews", "webcal", "ymsgr", + "bitcoin", "git", "svn", "bzr", "darcs", "hg" ); # data is a special case. Allow a few data:image/ types, # but disallow data:text/javascript and everything else. diff --git a/debian/changelog b/debian/changelog index fdd8308b9..e9eb2704b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,7 @@ ikiwiki (3.20121213) UNRELEASED; urgency=low * htmlscrubber: Allow the bitcoin URI scheme. + * htmlscrubber: Allow the URI schemes of major VCS's. * aggregate: When run with --aggregate, if an aggregation is already running, don't go on and --refresh. * trail: Avoid excess dependencies between pages in the trail From 04a4b42e74b751339aafda2f9c3a1bf2bc1b308a Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlOk9VewMsQ9aV2U9mkpZdHK_BQtu33EGE" Date: Sun, 6 Jan 2013 12:37:06 -0400 Subject: [PATCH 834/849] a little sandbox test --- doc/sandbox.mdwn | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index 9234603fc..d3b7e7283 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -31,6 +31,7 @@ Bulleted list * footballs; runner; unices * Cool ! +test _this_ out. ---- From 68cb5c9bcc5fb6efb14c5dd238ef9c6efba9cf83 Mon Sep 17 00:00:00 2001 From: "http://tgpfeiffer.myopenid.com/" Date: Tue, 8 Jan 2013 19:55:53 -0400 Subject: [PATCH 835/849] --- doc/examples/blog/posts/first_post/discussion.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/examples/blog/posts/first_post/discussion.mdwn diff --git a/doc/examples/blog/posts/first_post/discussion.mdwn b/doc/examples/blog/posts/first_post/discussion.mdwn new file mode 100644 index 000000000..9daeafb98 --- /dev/null +++ b/doc/examples/blog/posts/first_post/discussion.mdwn @@ -0,0 +1 @@ +test From 38632c74204a7d53efb0ea313d6202d8214cdf12 Mon Sep 17 00:00:00 2001 From: "http://pmate.myopenid.com/" Date: Wed, 9 Jan 2013 11:23:22 -0400 Subject: [PATCH 836/849] updated my homepage and blog addresses --- doc/ikiwikiusers.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn index 87773714c..bb94242bb 100644 --- a/doc/ikiwikiusers.mdwn +++ b/doc/ikiwikiusers.mdwn @@ -164,7 +164,7 @@ Personal sites and blogs * [Marco Silva](http://marcot.eti.br/) a weblog + wiki using the [darcs](http://darcs.net) backend * [NeX-6](http://nex-6.taht.net/) ikiwiki blog and wiki running over ipv6 * [Jason Riedy](http://lovesgoodfood.com/jason/), which may occasionally look funny if I'm playing with my branch... -* [pmate](http://pmate.nfshost.com)'s homepage and [blog](http://pmate.nfshost.com/blog/) +* [pmate](http://www.gnurant.org)'s homepage and [blog](http://www.gnurant.org/blog/) * [tychoish.com](http://tychoish.com/) - a blog/wiki mashup. blog posts are "rhizomes." * [Martin Burmester](http://www.martin-burmester.de/) * [Øyvind A. Holm (sunny256)](http://www.sunbase.org) — Read my Ikiwiki praise [here](http://www.sunbase.org/blog/why_ikiwiki/). From 5e547c3aa1efbd78b5c1610f27ebcd2d61f16409 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 9 Jan 2013 13:47:41 -0400 Subject: [PATCH 837/849] clean up --- doc/examples/blog/posts/first_post/discussion.mdwn | 1 - 1 file changed, 1 deletion(-) delete mode 100644 doc/examples/blog/posts/first_post/discussion.mdwn diff --git a/doc/examples/blog/posts/first_post/discussion.mdwn b/doc/examples/blog/posts/first_post/discussion.mdwn deleted file mode 100644 index 9daeafb98..000000000 --- a/doc/examples/blog/posts/first_post/discussion.mdwn +++ /dev/null @@ -1 +0,0 @@ -test From 37cf511f06cd7a187d4b85c1cc4bf0abaaa7bd7d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 10 Jan 2013 12:43:27 -0400 Subject: [PATCH 838/849] poll: Add expandable option to allow users to easily add new choices to a poll. --- IkiWiki/Plugin/poll.pm | 28 +++++++++++++++++++++++++--- debian/changelog | 2 ++ doc/ikiwiki/directive/poll.mdwn | 2 ++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/IkiWiki/Plugin/poll.pm b/IkiWiki/Plugin/poll.pm index 2773486a6..32756a571 100644 --- a/IkiWiki/Plugin/poll.pm +++ b/IkiWiki/Plugin/poll.pm @@ -23,11 +23,13 @@ sub getsetup () { my %pagenum; sub preprocess (@) { - my %params=(open => "yes", total => "yes", percent => "yes", @_); + my %params=(open => "yes", total => "yes", percent => "yes", + expandable => "no", @_); my $open=IkiWiki::yesno($params{open}); my $showtotal=IkiWiki::yesno($params{total}); my $showpercent=IkiWiki::yesno($params{percent}); + my $expandable=IkiWiki::yesno($params{expandable}); $pagenum{$params{page}}++; my %choices; @@ -74,6 +76,19 @@ sub preprocess (@) { $ret.="\n"; } } + + if ($expandable && $open && exists $config{cgiurl}) { + $ret.="

\n"; + $ret.="

\n"; + $ret.="\n"; + $ret.="\n"; + $ret.="\n"; + $ret.=gettext("Write in").": \n"; + $ret.="\n"; + $ret.="
\n"; + $ret.="

\n"; + } + if ($showtotal) { $ret.="".gettext("Total votes:")." $total\n"; } @@ -85,7 +100,7 @@ sub sessioncgi ($$) { my $session=shift; if (defined $cgi->param('do') && $cgi->param('do') eq "poll") { my $choice=decode_utf8($cgi->param('choice')); - if (! defined $choice) { + if (! defined $choice || not length $choice) { error("no choice specified"); } my $num=$cgi->param('num'); @@ -118,7 +133,14 @@ sub sessioncgi ($$) { my $params=shift; return "\\[[$prefix $params]]" if $escape; if (--$num == 0) { - $params=~s/(^|\s+)(\d+)\s+"?\Q$choice\E"?(\s+|$)/$1.($2+1)." \"$choice\"".$3/se; + if ($params=~s/(^|\s+)(\d+)\s+"?\Q$choice\E"?(\s+|$)/$1.($2+1)." \"$choice\"".$3/se) { + } + elsif ($params=~/expandable=(\w+)/ + & &IkiWiki::yesno($1)) { + $choice=~s/["\]\n\r]//g; + $params.=" 1 \"$choice\"" + if length $choice; + } if (defined $oldchoice) { $params=~s/(^|\s+)(\d+)\s+"?\Q$oldchoice\E"?(\s+|$)/$1.($2-1 >=0 ? $2-1 : 0)." \"$oldchoice\"".$3/se; } diff --git a/debian/changelog b/debian/changelog index e9eb2704b..cf6d90a8a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -8,6 +8,8 @@ ikiwiki (3.20121213) UNRELEASED; urgency=low and the page defining the trail. Thanks, smcv. * opendiscussion: Don't allow editing discussion pages if discussion pages are disabled. (smcv) + * poll: Add expandable option to allow users to easily add new choices to + a poll. -- Joey Hess Sat, 22 Dec 2012 16:15:24 -0400 diff --git a/doc/ikiwiki/directive/poll.mdwn b/doc/ikiwiki/directive/poll.mdwn index 6aa3d2cea..0b47a2167 100644 --- a/doc/ikiwiki/directive/poll.mdwn +++ b/doc/ikiwiki/directive/poll.mdwn @@ -19,6 +19,8 @@ Parameters: * `open` - Whether voting is still open. Set to "no" to close the poll to voting. +* `expandable` - Set to "yes" to make this poll have an interface to add + another choice to the poll. * `total` - Show total number of votes at bottom of poll. Default is "yes". * `percent` - Whether to display percents. Default is "yes". From 066cabd5a6ec6d1411fb61494659854c2f864a0f Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlvXbHYq84PNWzprLPASDcGgN-beeYMoOg" Date: Sat, 12 Jan 2013 20:42:36 -0400 Subject: [PATCH 839/849] Add a patch tag --- doc/todo/Set_templates_for_whole_sections_of_the_site.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/todo/Set_templates_for_whole_sections_of_the_site.mdwn b/doc/todo/Set_templates_for_whole_sections_of_the_site.mdwn index e679d98e0..0dbda8a3a 100644 --- a/doc/todo/Set_templates_for_whole_sections_of_the_site.mdwn +++ b/doc/todo/Set_templates_for_whole_sections_of_the_site.mdwn @@ -37,3 +37,5 @@ I've written a new plugin, sectiontemplate, available in the `page_tmpl` branch >>>>> I've implemented this functionality as part of `pagetemplate` as on my "pagetemplate" branch of ikiwiki at https://github.com/rubykat/ikiwiki/tree/pagetemplate - do you want to pull this, Joey? >>>>> It isn't implemented quite the same way as Will did; I have the template name first and the pagespec last, but it does the same thing. >>>>> --[[KathrynAndersen]] + +Just a quick note that Kathryn's branch is ready.[[!template id=gitbranch branch=rubykat/pagetemplate author="[[KathrynAndersen]]"]][[!tag patch]] --[[Will]] From 33c38a9558733d5a9d8e93ccdb2121ad74337001 Mon Sep 17 00:00:00 2001 From: "https://openid.fmarier.org/" Date: Fri, 18 Jan 2013 04:42:05 -0400 Subject: [PATCH 840/849] Add a link to my own migration notes --- doc/tips/convert_blogger_blogs_to_ikiwiki.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/tips/convert_blogger_blogs_to_ikiwiki.mdwn b/doc/tips/convert_blogger_blogs_to_ikiwiki.mdwn index 39ffc0404..e71e2132d 100644 --- a/doc/tips/convert_blogger_blogs_to_ikiwiki.mdwn +++ b/doc/tips/convert_blogger_blogs_to_ikiwiki.mdwn @@ -1,3 +1,5 @@ Daniel Burrows [explains](http://algebraicthunk.net/~dburrows/blog/entry/howto-convert-your-blogger-or-blogspot-blog-to-ikiwiki/) how to convert your Blogger/BlogSpot blog to ikiwiki. + +François Marier used a [different approach](http://feeding.cloud.geek.nz/posts/moving-from-blogger-to-ikiwiki-and-branchable/) on a more recent version of Blogger. From 3b92fb529bc33e957a2826a67d617e82a8e19836 Mon Sep 17 00:00:00 2001 From: "http://claimid.com/richard-lyons" Date: Fri, 18 Jan 2013 16:53:00 -0400 Subject: [PATCH 841/849] Added note about apache2 userdir mod. --- doc/tips/dot_cgi.mdwn | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/tips/dot_cgi.mdwn b/doc/tips/dot_cgi.mdwn index bb0a4fd97..dc88d9595 100644 --- a/doc/tips/dot_cgi.mdwn +++ b/doc/tips/dot_cgi.mdwn @@ -28,6 +28,10 @@ configuration changes should work anywhere. You may also want to install some dependencies to enable CGI in apache2 setup as: `libcgi-formbuilder-perl` and `libcgi-session-perl`. +* If your wiki is in `~/public_html` and does not appear when you enter the URL given by the installer, check that you have + the userdir mod enabled (there should be simlinks to userdir.load and userdir.conf in /etc/apache2/modes-enabled). If not, + run `a2enmod userdir` and reload apache2. + * You may also want to enable the [[plugins/404]] plugin. To make apache use it, the apache config file will need a further modification to make it use ikiwiki's CGI as the apache 404 handler. From 4ee95c08daf37379e7ce25cb17b8049762cb3321 Mon Sep 17 00:00:00 2001 From: "125.118.197.218" <125.118.197.218@web> Date: Fri, 18 Jan 2013 23:34:10 -0400 Subject: [PATCH 842/849] poll vote (Accept both) --- doc/news/openid.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/news/openid.mdwn b/doc/news/openid.mdwn index c5af6cd30..b13e82146 100644 --- a/doc/news/openid.mdwn +++ b/doc/news/openid.mdwn @@ -10,4 +10,4 @@ log back in, try out the OpenID signup process if you don't already have an OpenID, and see how OpenID works for you. And let me know your feelings about making such a switch. --[[Joey]] -[[!poll 69 "Accept only OpenID for logins" 21 "Accept only password logins" 43 "Accept both"]] +[[!poll 69 "Accept only OpenID for logins" 21 "Accept only password logins" 44 "Accept both"]] From d23ecdea299ddfc5ff12c76dc619bb2b1557d16b Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlRjjrKEyPmXnh2qBEGx9PgH5DP32wCMAQ" Date: Sat, 19 Jan 2013 11:59:10 -0400 Subject: [PATCH 843/849] Added a comment: figured it out --- ...mment_2_80296d67c7f1dd75b56b85c14f5efa3b._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_2_80296d67c7f1dd75b56b85c14f5efa3b._comment diff --git a/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_2_80296d67c7f1dd75b56b85c14f5efa3b._comment b/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_2_80296d67c7f1dd75b56b85c14f5efa3b._comment new file mode 100644 index 000000000..e7659413e --- /dev/null +++ b/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_2_80296d67c7f1dd75b56b85c14f5efa3b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlRjjrKEyPmXnh2qBEGx9PgH5DP32wCMAQ" + nickname="Jonathon" + subject="figured it out" + date="2013-01-19T15:59:09Z" + content=""" +It looks like this was just another expression of [the header size limit issue] [1] that has already been reported and addressed. + +I got `3.20120629` from `squeeze-backports`, and my issue has been resolved. + +[1]: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=638009 +"""]] From 5cabb1d3083a7a77f7b1c8d9c2d9c94337087c03 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlCFhR_YAuzSkesD1dM03GnKbGfitdB8dE" Date: Sun, 20 Jan 2013 10:14:46 -0400 Subject: [PATCH 844/849] --- doc/sandbox.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index d3b7e7283..5049a4656 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -33,6 +33,8 @@ Bulleted list test _this_ out. +`test this code block` + ---- [[!template id=note text="this is generated by the [[plugins/haiku]] plugin"]] From f5dd7063963c9ef466cadf92948792ec5afa4df6 Mon Sep 17 00:00:00 2001 From: "http://claimid.com/richard-lyons" Date: Mon, 21 Jan 2013 12:13:02 -0400 Subject: [PATCH 845/849] Question on source for plugins and themes plugin. --- doc/forum/Where_can_I_get_plugins__63__.mdwn | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/forum/Where_can_I_get_plugins__63__.mdwn diff --git a/doc/forum/Where_can_I_get_plugins__63__.mdwn b/doc/forum/Where_can_I_get_plugins__63__.mdwn new file mode 100644 index 000000000..536bd5f40 --- /dev/null +++ b/doc/forum/Where_can_I_get_plugins__63__.mdwn @@ -0,0 +1,3 @@ +New to Ikiwiki, I like the principles but regret the lack of documentation. + +I would like to try the themes plugin. Is there a repository for plugins somewhere? From 31755cc1e2c846b1304ca16f74e7e5af4e4b6a86 Mon Sep 17 00:00:00 2001 From: "http://claimid.com/richard-lyons" Date: Mon, 21 Jan 2013 12:15:43 -0400 Subject: [PATCH 846/849] removed --- doc/forum/Where_can_I_get_plugins__63__.mdwn | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 doc/forum/Where_can_I_get_plugins__63__.mdwn diff --git a/doc/forum/Where_can_I_get_plugins__63__.mdwn b/doc/forum/Where_can_I_get_plugins__63__.mdwn deleted file mode 100644 index 536bd5f40..000000000 --- a/doc/forum/Where_can_I_get_plugins__63__.mdwn +++ /dev/null @@ -1,3 +0,0 @@ -New to Ikiwiki, I like the principles but regret the lack of documentation. - -I would like to try the themes plugin. Is there a repository for plugins somewhere? From 85788d09e5f9ba3bb89c07a9fb698bcd973700b6 Mon Sep 17 00:00:00 2001 From: spalax Date: Mon, 21 Jan 2013 13:23:59 -0400 Subject: [PATCH 847/849] --- ...ar:_listing_multiple_entries_per_day_.mdwn | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 doc/todo/Calendar:_listing_multiple_entries_per_day_.mdwn diff --git a/doc/todo/Calendar:_listing_multiple_entries_per_day_.mdwn b/doc/todo/Calendar:_listing_multiple_entries_per_day_.mdwn new file mode 100644 index 000000000..707dfa8a4 --- /dev/null +++ b/doc/todo/Calendar:_listing_multiple_entries_per_day_.mdwn @@ -0,0 +1,93 @@ +[[!tag patch]] + +I am copying stuff discussed in the [[forum|/forum/Calendar:_listing_multiple_entries_per_day]], since the [[patch]] only list pages that are todo or bugs. + +If there are several pages created on the same date, the [[calendar directive|/ikiwiki/directive/calendar]] only display the first one. +Here is a patch that: + +- if there is a single entry in one day, does not change anything (compared to the previous version of the calendar plugin); +- if there are several entries, when mouse passes over the day, displays a popup listing all the entries of that day. + +That's all. No new pages for each day, takes as little space as it took before, and only a few lines more in the source. + +The only thing I am not totally happy with is the CSS. We have to say that the text is aligned on the left (otherwise, it is aligned on the right, as is each day of the calendar), but I do not know which place is the more sensible to put that line of CSS in. + +Regards, +-- Louis + + + diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm + index d443198..2c9ed79 100644 + --- a/IkiWiki/Plugin/calendar.pm + +++ b/IkiWiki/Plugin/calendar.pm + @@ -86,8 +86,11 @@ sub format_month (@) { + my $year = $date[5] + 1900; + my $mtag = sprintf(\"%02d\", $month); + + - # Only one posting per day is being linked to. + - $linkcache{\"$year/$mtag/$mday\"} = $p; + + # Several postings per day + + if (! $linkcache{\"$year/$mtag/$mday\"}) { + + $linkcache{\"$year/$mtag/$mday\"} = []; + + } + + push(@{$linkcache{\"$year/$mtag/$mday\"}}, $p); + } + + my $pmonth = $params{month} - 1; + @@ -221,11 +224,36 @@ EOF + $tag='month-calendar-day-link'; + } + $calendar.=qq{\t\t}; + - $calendar.=htmllink($params{page}, $params{destpage}, + - $linkcache{$key}, + - noimageinline => 1, + - linktext => $day, + - title => pagetitle(IkiWiki::basename($linkcache{$key}))); + + if ( scalar(@{$linkcache{$key}}) == 1) { + + # Only one posting on this page + + my $page = $linkcache{$key}[0]; + + $calendar.=htmllink($params{page}, $params{destpage}, + + $page, + + noimageinline => 1, + + linktext => $day, + + title => pagetitle(IkiWiki::basename($page))); + + } else { + + $calendar.=qq{}; + + } + $calendar.=qq{\n}; + } + else { + diff --git a/doc/style.css b/doc/style.css + old mode 100644 + new mode 100755 + index 6e2afce..4149229 + --- a/doc/style.css + +++ b/doc/style.css + @@ -316,6 +316,7 @@ div.progress-done { + .popup .paren, + .popup .expand { + display: none; + + text-align: left; + } + .popup:hover .balloon, + .popup:focus .balloon { + From 590527a1026c515796d77ac73cd6cbd5d4cf277f Mon Sep 17 00:00:00 2001 From: spalax Date: Mon, 21 Jan 2013 13:38:23 -0400 Subject: [PATCH 848/849] More up-to-date patch --- ...ar:_listing_multiple_entries_per_day_.mdwn | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/doc/todo/Calendar:_listing_multiple_entries_per_day_.mdwn b/doc/todo/Calendar:_listing_multiple_entries_per_day_.mdwn index 707dfa8a4..94a4f1577 100644 --- a/doc/todo/Calendar:_listing_multiple_entries_per_day_.mdwn +++ b/doc/todo/Calendar:_listing_multiple_entries_per_day_.mdwn @@ -22,22 +22,22 @@ Regards, +++ b/IkiWiki/Plugin/calendar.pm @@ -86,8 +86,11 @@ sub format_month (@) { my $year = $date[5] + 1900; - my $mtag = sprintf(\"%02d\", $month); + my $mtag = sprintf("%02d", $month); - # Only one posting per day is being linked to. - - $linkcache{\"$year/$mtag/$mday\"} = $p; + - $linkcache{"$year/$mtag/$mday"} = $p; + # Several postings per day - + if (! $linkcache{\"$year/$mtag/$mday\"}) { - + $linkcache{\"$year/$mtag/$mday\"} = []; + + if (! $linkcache{"$year/$mtag/$mday"}) { + + $linkcache{"$year/$mtag/$mday"} = []; + } - + push(@{$linkcache{\"$year/$mtag/$mday\"}}, $p); + + push(@{$linkcache{"$year/$mtag/$mday"}}, $p); } my $pmonth = $params{month} - 1; @@ -221,11 +224,36 @@ EOF $tag='month-calendar-day-link'; } - $calendar.=qq{\t\t}; + $calendar.=qq{\t\t}; - $calendar.=htmllink($params{page}, $params{destpage}, - $linkcache{$key}, - noimageinline => 1, @@ -59,7 +59,7 @@ Regards, + $calendar.= qq{\n\t\t\t
  • }; + my $title; + if (exists $pagestate{$page}{meta}{title}) { - + $title = \"$pagestate{$page}{meta}{title}\"; + + $title = "$pagestate{$page}{meta}{title}"; + } else { + $title = pagetitle(IkiWiki::basename($page)); + } @@ -79,10 +79,10 @@ Regards, diff --git a/doc/style.css b/doc/style.css old mode 100644 new mode 100755 - index 6e2afce..4149229 + index 424d438..b52c72b --- a/doc/style.css +++ b/doc/style.css - @@ -316,6 +316,7 @@ div.progress-done { + @@ -323,6 +323,7 @@ div.progress-done { .popup .paren, .popup .expand { display: none; @@ -90,4 +90,3 @@ Regards, } .popup:hover .balloon, .popup:focus .balloon { - From e5d82ef8680dce98b3afab43605d7b278c98c789 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 24 Jan 2013 10:40:35 +1100 Subject: [PATCH 849/849] trail: Avoid massive slowdown caused by pagetemplate hook when displaying dynamic cgi pages, which cannot use trail anyway. This seemed to be due to the pagetemplate hook calling prerender. I've observed this making it take *minutes* for the signin page to be displayed. ltracing ikiwiki showed it was matching pagespecs a lot. It may be that this is still a speed pain point when rendering pages, not just for CGI. So more work may be needed here. --- IkiWiki/Plugin/trail.pm | 2 ++ debian/changelog | 2 ++ 2 files changed, 4 insertions(+) diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index cb94855fd..d5fb2b5d6 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -411,6 +411,8 @@ sub pagetemplate (@) { my $page = $params{page}; my $template = $params{template}; + return unless length $page; + if ($template->query(name => 'trails') && ! $recursive) { prerender(); diff --git a/debian/changelog b/debian/changelog index cf6d90a8a..d1d132e1e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -10,6 +10,8 @@ ikiwiki (3.20121213) UNRELEASED; urgency=low are disabled. (smcv) * poll: Add expandable option to allow users to easily add new choices to a poll. + * trail: Avoid massive slowdown caused by pagetemplate hook when displaying + dynamic cgi pages, which cannot use trail anyway. -- Joey Hess Sat, 22 Dec 2012 16:15:24 -0400
  • JxzVMw6Lbo{Q{laIt3$P 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 JM#1vK{{Y3$76$+T diff --git a/doc/themes/monochrome_small.png b/doc/themes/monochrome_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6c98100a1a66a930dcf2464ccce0df9ee2aceac3 GIT binary patch literal 21054 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 JPDHLkV1oE@Hemn& literal 0 HcmV?d00001 From 150d2c09008d029f8fd85edc365966328ee73214 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 30 Aug 2012 11:55:59 -0400 Subject: [PATCH 662/849] update copyright and changelog --- debian/changelog | 6 ++++++ debian/copyright | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/debian/changelog b/debian/changelog index c2c58861a..5aa937d15 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +ikiwiki (3.20120726) UNRELEASED; urgency=low + + * monochrome: New theme, contributed by Jon Dowland. + + -- Joey Hess Thu, 30 Aug 2012 11:56:12 -0400 + ikiwiki (3.20120725) unstable; urgency=low * recentchangesdiff: When diffurl is not set, provide inline diffs diff --git a/debian/copyright b/debian/copyright index ee52c0eda..e1a81932b 100644 --- a/debian/copyright +++ b/debian/copyright @@ -248,6 +248,10 @@ Files: underlays/themes/goldtype/* Copyright: © Lars Wirzenius License: GPL-2+ +Files: underlays/themes/monochrome/* +Copyright: © 2012 Jon Dowland +License: GPL-2+ + License: BSD-2-clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions From 6064164501ff6a7a7684196b1ec1f7f96a2d4289 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 30 Aug 2012 12:01:27 -0400 Subject: [PATCH 663/849] merged; followup questions --- doc/todo/monochrome_theme.mdwn | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/doc/todo/monochrome_theme.mdwn b/doc/todo/monochrome_theme.mdwn index ebaca9b4f..f4c8a0203 100644 --- a/doc/todo/monochrome_theme.mdwn +++ b/doc/todo/monochrome_theme.mdwn @@ -15,3 +15,20 @@ Perhaps controversially, I think that this would be a good basis for a default t >> Sure I'll sort that out. Sorry, I didn't realise the prepending was an automatic process. I did it manually. It should be quick for me to fix. — [[Jon]] >>> Fixed. I rebased the branch; hopefully that won't cause your script issues. — [[Jon]] + +>>>> I've merged your branch. +>>>> +>>>> Looking more closely at the css, I do have a few questions: +>>>> +>>>> * Is the google-provided font really necessary? I consider that a sort +>>>> of web bug, I would prefer users of ikiwiki not need to worry that +>>>> their referer information is being sent to some third party. +>>>> I'd also prefer for ikiwiki sites to always be functional when +>>>> viewed offline. +>>>> * The external link markup needs the local url to be put into +>>>> local.css to work right, correct? I wonder if this is too much of a +>>>> complication to ask of users. It seems to be it could either be left +>>>> out of the theme, or perhaps ikiwiki could be made to expand +>>>> something in the css to the site's url at build time. +>>>> +>>>> --[[Joey]] From 13d855f5b8c0988da3c640f928042946ddb15204 Mon Sep 17 00:00:00 2001 From: "http://jmtd.net/" Date: Thu, 30 Aug 2012 13:47:26 -0400 Subject: [PATCH 664/849] Thanks for merging! --- doc/todo/monochrome_theme.mdwn | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/doc/todo/monochrome_theme.mdwn b/doc/todo/monochrome_theme.mdwn index f4c8a0203..0c7c1a3cb 100644 --- a/doc/todo/monochrome_theme.mdwn +++ b/doc/todo/monochrome_theme.mdwn @@ -31,4 +31,16 @@ Perhaps controversially, I think that this would be a good basis for a default t >>>> out of the theme, or perhaps ikiwiki could be made to expand >>>> something in the css to the site's url at build time. >>>> ->>>> --[[Joey]] +>>>> --[[Joey]] + +>>>>>Thanks for merging! +>>>>> * the font is not necessary. I will check, it might be license-compatible +>>>>> and thus could be bundled. As things stand, if people have no 'net connection +>>>>> or the font fails to load, the theme still "works". Good point RE the referral +>>>>> situation. +>>>>> * The external link markup works without customizing the CSS, but if something +>>>>> generates a non-relative link within the content area of a page, it will be +>>>>> styled as an external link. By default, nothing does this in ikiwiki afaik, +>>>>> so the impact is pretty small. (except perhaps if someone specifies an absolute +>>>>> `cgiurl` path?) The additional customization is belt-and-braces. +>>>>> — [[Jon]] From 982949305c42e81e32dd278034f760dd44712d1f Mon Sep 17 00:00:00 2001 From: "http://jmtd.net/" Date: Thu, 30 Aug 2012 13:48:37 -0400 Subject: [PATCH 665/849] some escapes --- doc/todo/publishing_in_the_future.mdwn | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/todo/publishing_in_the_future.mdwn b/doc/todo/publishing_in_the_future.mdwn index a3cdacedb..8d94f1f00 100644 --- a/doc/todo/publishing_in_the_future.mdwn +++ b/doc/todo/publishing_in_the_future.mdwn @@ -7,7 +7,7 @@ useful? Thinking about how to implement this in ikiwiki, perhaps a conditional pagespec would be best (which could be tidied up into a template) - [[!if test="current_date_before()" + \[[!if test="current_date_before()" then="""[[!tag draft]]""" else="""[[!meta date=""]]""" ]] @@ -15,7 +15,7 @@ pagespec would be best (which could be tidied up into a template) …pre-supposing a scheme whereby tagging 'draft' hides the page from an aggregation somewhere. With a template, this could collapse to - [[!template id=publishafter date="Thu Aug 30 14:13:06 BST 2012"]] + \[[!template id=publishafter date="Thu Aug 30 14:13:06 BST 2012"]] This would require implementing the `current_date_before` pagespec. @@ -24,7 +24,7 @@ unpublished pages as 'dirty' so they were always scanned on refresh until their publish date has occurred. That could perhaps be implemented via a small plugin which defined a pagespec which ensured the page was 'dirty': - [[!if test="current_date_before()" + \[[!if test="current_date_before()" then="""[[!tag draft]][[!dirty]]""" else="""[[!meta date=""]]""" ]] From c18922c7e0a0b2241366e89f2004d7a29b20cfbe Mon Sep 17 00:00:00 2001 From: "http://jmtd.net/" Date: Thu, 30 Aug 2012 13:49:23 -0400 Subject: [PATCH 666/849] newlines for render fixes --- doc/todo/monochrome_theme.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/todo/monochrome_theme.mdwn b/doc/todo/monochrome_theme.mdwn index 0c7c1a3cb..eaf51c080 100644 --- a/doc/todo/monochrome_theme.mdwn +++ b/doc/todo/monochrome_theme.mdwn @@ -34,10 +34,12 @@ Perhaps controversially, I think that this would be a good basis for a default t >>>> --[[Joey]] >>>>>Thanks for merging! +>>>>> >>>>> * the font is not necessary. I will check, it might be license-compatible >>>>> and thus could be bundled. As things stand, if people have no 'net connection >>>>> or the font fails to load, the theme still "works". Good point RE the referral >>>>> situation. +>>>>> >>>>> * The external link markup works without customizing the CSS, but if something >>>>> generates a non-relative link within the content area of a page, it will be >>>>> styled as an external link. By default, nothing does this in ikiwiki afaik, From 061598a0de5ea1e0534f34ddd8408a9f5ad2f2c4 Mon Sep 17 00:00:00 2001 From: "http://jmtd.net/" Date: Thu, 30 Aug 2012 13:51:52 -0400 Subject: [PATCH 667/849] revert odd hyperlink insertion to google --- doc/index.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/index.mdwn b/doc/index.mdwn index 02c523d98..4c22ce0e0 100644 --- a/doc/index.mdwn +++ b/doc/index.mdwn @@ -17,7 +17,7 @@ discussions. All wikis are supposed to have a [[sandbox]], so this one does too. This site generally runs the latest release of ikiwiki; currently, it runs -ikiwiki [[!version ]]. +ikiwiki [[!version ]]. ## developer resources From 4b2fce02068c0c41dd1755d47a6942b56d274a7f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 30 Aug 2012 16:16:03 -0400 Subject: [PATCH 668/849] pointer --- doc/todo/publishing_in_the_future.mdwn | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/todo/publishing_in_the_future.mdwn b/doc/todo/publishing_in_the_future.mdwn index 8d94f1f00..2b7a43da7 100644 --- a/doc/todo/publishing_in_the_future.mdwn +++ b/doc/todo/publishing_in_the_future.mdwn @@ -89,3 +89,8 @@ grateful. If anyone has any clues as to why this doesn't work Thoughts on the whole idea? — [[Jon]] + +> There is an old todo about it: [[tagging_with_a_publication_date]]. +> I feel my idea there about making a pagespec that is limited to +> items in the present/past, combined with setting the meta data, is a good +> way.. --[[Joey]] From 8f598d529ed448d48f80b3efa91f449e1cd2c73b Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Fri, 31 Aug 2012 01:33:21 -0400 Subject: [PATCH 669/849] sign an old comment of mine --- doc/plugins/contrib/getfield/discussion.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/plugins/contrib/getfield/discussion.mdwn b/doc/plugins/contrib/getfield/discussion.mdwn index d3c1a1277..3d1d038cb 100644 --- a/doc/plugins/contrib/getfield/discussion.mdwn +++ b/doc/plugins/contrib/getfield/discussion.mdwn @@ -14,7 +14,7 @@ yields: ARRAY(0x266db10) -Seems to me this could be checked and `join(" ")`'d. :) +Seems to me this could be checked and `join(" ")`'d. :) -- [[anarcat]] ## Templating, and other uses From 7a8981437e6f2c2a02b0b212b84f74c895ef66f9 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Fri, 31 Aug 2012 01:44:40 -0400 Subject: [PATCH 670/849] a first bugfix for array support --- doc/plugins/contrib/getfield/discussion.mdwn | 29 ++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/doc/plugins/contrib/getfield/discussion.mdwn b/doc/plugins/contrib/getfield/discussion.mdwn index 3d1d038cb..13ea8b1b3 100644 --- a/doc/plugins/contrib/getfield/discussion.mdwn +++ b/doc/plugins/contrib/getfield/discussion.mdwn @@ -16,6 +16,35 @@ yields: Seems to me this could be checked and `join(" ")`'d. :) -- [[anarcat]] +> I wrote a stupid fix for this, which works for getfield, but isn't as good for report. It simply does that `join()`. Here's the patch: +> +> [[!format diff """ +--- a/IkiWiki/Plugin/field.pm ++++ b/IkiWiki/Plugin/field.pm +@@ -322,6 +322,9 @@ sub field_get_value ($$;@) { + { + $basevalue = calculated_values($lc_field_name, $page); + } ++ if (ref($basevalue) eq "ARRAY") { ++ $basevalue = join(" ", @{$basevalue}); # hack ++ } + if (defined $basevalue) + { + $Cache{$page}{$basename} = $basevalue; +@@ -360,6 +363,9 @@ sub field_get_value ($$;@) { + { + $value = $basevalue; + } ++ if (ref($value) eq "ARRAY") { ++ $value = join(" ", @{$value}); # hack ++ } + if (defined $value) + { + $Cache{$page}{$lc_field_name} = $value; +"""]] +> +> Seems to me this should be the default, at the very least in getfield. But at least, with the above patch we don't see expanded Perl ref's. ;) --[[anarcat]] + ## Templating, and other uses Like you mentioned in [[ftemplate]] IIRC, it'll only work on the same page. If it can be made to work anywhere, or from a specific place in the wiki - configurable, possibly - you'll have something very similar to mediawiki's templates. I can already think of a few uses for this combined with [[template]] ;) . --[[SR|users/simonraven]] From 49498cedee90a68f61ec3cf666926c08254b96aa Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Fri, 31 Aug 2012 01:46:53 -0400 Subject: [PATCH 671/849] question how we should process multiple value fields --- doc/plugins/contrib/report/discussion.mdwn | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/plugins/contrib/report/discussion.mdwn b/doc/plugins/contrib/report/discussion.mdwn index e23a4ced4..419c4bca6 100644 --- a/doc/plugins/contrib/report/discussion.mdwn +++ b/doc/plugins/contrib/report/discussion.mdwn @@ -73,3 +73,8 @@ to select pages? How does it relate to [[todo/wikitrails]] or >>>>> It might be that adding arrays to the `field` plugin is a good way to go: after all, even though field=value is the most common, with the flexibility of things like YAML, one could define all sorts of things. What I'm not so sure about is how to return the values when queried, since some things would be expecting scalars all the time. Ah, perhaps I could use wantarray? >>>>> Is there a way of checking a HTML::Template template to see if it expecting an array for a particular value? >>>>> --[[KathrynAndersen]] + +How about arrays? +----------------- + +In [[plugins/contrib/getfield/discussion]], I outline how there's a problem in getfield displaying array refs when the data is a YAML array. I also propose a patch there so that arrays are join'd with a space separator, which is less than ideal, but at least works for getfield. However, for report, I am not sure it's as good. Should it make two rows for those? How should we parse this? Thanks. -- [[anarcat]] From 742f46a540f39bfa5887f20074037a798553f184 Mon Sep 17 00:00:00 2001 From: Mayank Date: Fri, 7 Sep 2012 04:51:55 -0400 Subject: [PATCH 672/849] Beginners testing --- doc/sandbox.mdwn | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn index 0a5af6a25..3d0fba4b3 100644 --- a/doc/sandbox.mdwn +++ b/doc/sandbox.mdwn @@ -182,3 +182,7 @@ module vc_Mux2 #( parameter W = 1 ) endmodule """]] + +testing the ikiwiki sandbox. +Testing 1, 2, 3..... + From 1e40270c5b4f3c74c75d11da45897f8e876d2048 Mon Sep 17 00:00:00 2001 From: "http://lj.rossia.org/users/djdfy/" Date: Sat, 8 Sep 2012 02:59:39 -0400 Subject: [PATCH 673/849] --- doc/sandbox/sandbox_subpost.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/sandbox/sandbox_subpost.mdwn diff --git a/doc/sandbox/sandbox_subpost.mdwn b/doc/sandbox/sandbox_subpost.mdwn new file mode 100644 index 000000000..2f349c112 --- /dev/null +++ b/doc/sandbox/sandbox_subpost.mdwn @@ -0,0 +1 @@ +Hmm. I was'nt redirected to my openid provider. From bbb3079b60f22ffbe85156c15e39ac1d6d65f818 Mon Sep 17 00:00:00 2001 From: "http://lj.rossia.org/users/djdfy/" Date: Sat, 8 Sep 2012 03:01:58 -0400 Subject: [PATCH 674/849] --- ...ранслитерует_русские_буквы__63__.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/sandbox/Как_ikiwiki_транслитерует_русские_буквы__63__.mdwn diff --git a/doc/sandbox/Как_ikiwiki_транслитерует_русские_буквы__63__.mdwn b/doc/sandbox/Как_ikiwiki_транслитерует_русские_буквы__63__.mdwn new file mode 100644 index 000000000..dbb892382 --- /dev/null +++ b/doc/sandbox/Как_ikiwiki_транслитерует_русские_буквы__63__.mdwn @@ -0,0 +1 @@ +Как ikiwiki транслитерует русские буквы в URL? From 245d62cd9cc227f39547ce1e323150f05513a814 Mon Sep 17 00:00:00 2001 From: "http://lj.rossia.org/users/djdfy/" Date: Sat, 8 Sep 2012 03:19:39 -0400 Subject: [PATCH 675/849] --- ...анслитерует_русские_буквы__63__.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/sandbox/Как_ikiwiki_транслитерует_русские_буквы__63__.mdwn b/doc/sandbox/Как_ikiwiki_транслитерует_русские_буквы__63__.mdwn index dbb892382..315b0fd3f 100644 --- a/doc/sandbox/Как_ikiwiki_транслитерует_русские_буквы__63__.mdwn +++ b/doc/sandbox/Как_ikiwiki_транслитерует_русские_буквы__63__.mdwn @@ -1 +1,3 @@ Как ikiwiki транслитерует русские буквы в URL? + +Никак. Это хорошо. From 9e16527e9a1cd00e05dd3e22662f249c5295ef54 Mon Sep 17 00:00:00 2001 From: maxigas Date: Sun, 9 Sep 2012 22:56:25 -0400 Subject: [PATCH 676/849] --- ...ch_file_ikiwiki_--setup_is_processing_right_now__63__.mdwn | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__.mdwn diff --git a/doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__.mdwn b/doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__.mdwn new file mode 100644 index 000000000..6c5ee4301 --- /dev/null +++ b/doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__.mdwn @@ -0,0 +1,4 @@ +is there a way to know which file ikiwiki is currently processing while i am running "ikiwiki --setup $FOO.setup" ? + +i am migrating a large ikiwiki instance and the compiler dies in the middle of setup -- but i don't know which file is causing the problem. + From 8bb6708900a9cc9617ec3b2a0fd88b2dd4466022 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Fri, 14 Sep 2012 01:01:17 -0400 Subject: [PATCH 677/849] Added a comment: try --verbose --- .../comment_1_4f52f8fc083982bd5a572742cf35c74f._comment | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__/comment_1_4f52f8fc083982bd5a572742cf35c74f._comment diff --git a/doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__/comment_1_4f52f8fc083982bd5a572742cf35c74f._comment b/doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__/comment_1_4f52f8fc083982bd5a572742cf35c74f._comment new file mode 100644 index 000000000..21b5e7d2f --- /dev/null +++ b/doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__/comment_1_4f52f8fc083982bd5a572742cf35c74f._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + subject="try --verbose" + date="2012-09-14T05:01:16Z" + content=""" +you can try `--verbose` when you use `--rebuild`, otherwise you could also try `strace`. +"""]] From d96b7f492c48e7b2cec8b096af989107e8f94f4f Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Fri, 14 Sep 2012 01:29:08 -0400 Subject: [PATCH 678/849] --- ...nerate_a_flat_textfile_from_metadata_in_multiple_pages.mdwn | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/forum/how_could_i_generate_a_flat_textfile_from_metadata_in_multiple_pages.mdwn diff --git a/doc/forum/how_could_i_generate_a_flat_textfile_from_metadata_in_multiple_pages.mdwn b/doc/forum/how_could_i_generate_a_flat_textfile_from_metadata_in_multiple_pages.mdwn new file mode 100644 index 000000000..d82a419a3 --- /dev/null +++ b/doc/forum/how_could_i_generate_a_flat_textfile_from_metadata_in_multiple_pages.mdwn @@ -0,0 +1,3 @@ +I am already using the [[plugins/contrib/report]] plugin to generate reports aggregated from multiple pages, and it's great! However, I am now looking at generating non-HTML reports. Basically, I want to generate a BIND zonefile from the data aggregated from similar reports. I have gone as far as using the [[plugins/pagetemplate]] plugin to have an empty page as a template - but even that bit doesn't work as i still get pesky ` + + + + + + + + +