Recent changes to this wiki:

diff --git a/doc/users/alexeidz.mdwn b/doc/users/alexeidz.mdwn
index f6ada1795..1fa4c251a 100644
--- a/doc/users/alexeidz.mdwn
+++ b/doc/users/alexeidz.mdwn
@@ -1,3 +1,4 @@
 PROBLEM_1
 PROBLEM_2
 PROBLEM_3
+PROBLEM_4

diff --git a/doc/users/alexeidz.mdwn b/doc/users/alexeidz.mdwn
new file mode 100644
index 000000000..f6ada1795
--- /dev/null
+++ b/doc/users/alexeidz.mdwn
@@ -0,0 +1,3 @@
+PROBLEM_1
+PROBLEM_2
+PROBLEM_3

followup
diff --git a/doc/bugs/Unable_to_access_pagespec_preferences_on_https:__47____47__joeyh.name__47__/comment_1_8e26ec8941be9f6b16cec97281df7aaf._comment b/doc/bugs/Unable_to_access_pagespec_preferences_on_https:__47____47__joeyh.name__47__/comment_1_8e26ec8941be9f6b16cec97281df7aaf._comment
new file mode 100644
index 000000000..940366a7c
--- /dev/null
+++ b/doc/bugs/Unable_to_access_pagespec_preferences_on_https:__47____47__joeyh.name__47__/comment_1_8e26ec8941be9f6b16cec97281df7aaf._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2018-12-12T14:40:46Z"
+ content="""
+Sending an auth token with every notification email would
+not be good from a security POV.
+
+But, the ikiwiki username that has subscribed could be included in the
+emails; the url to the prefs could possibly even have it prefilled
+(unless CSRF protection or something prevents that).
+
+> I think now when I login via either method I'm accessing the account with a username
+
+No, ikiwiki accounts are not connected like this. If you log in with the
+old account it will have separate subscription prefs than the new account.
+"""]]

diff --git a/doc/users/xuqi.mdwn b/doc/users/xuqi.mdwn
index f127147e8..b2bddb070 100644
--- a/doc/users/xuqi.mdwn
+++ b/doc/users/xuqi.mdwn
@@ -1 +1 @@
-Hi there, I'm Xu Qi. I am an editor (who process and critique literature works, I don't compete with Vim or Emacs). I have been using [[ikiwiki]] on and off for 4 years. Comments welcome.
+Hi there, I'm XU Qi (he/him). I am an editor (who process and critique literature works, I don't compete with Vim or Emacs). I have been using [[ikiwiki]] on and off for 4 years. Comments welcome.

diff --git a/doc/users/xuqi.mdwn b/doc/users/xuqi.mdwn
new file mode 100644
index 000000000..f127147e8
--- /dev/null
+++ b/doc/users/xuqi.mdwn
@@ -0,0 +1 @@
+Hi there, I'm Xu Qi. I am an editor (who process and critique literature works, I don't compete with Vim or Emacs). I have been using [[ikiwiki]] on and off for 4 years. Comments welcome.

de-indenting
diff --git a/doc/ikiwiki/pagespec.mdwn b/doc/ikiwiki/pagespec.mdwn
index 9045d032d..59a0506d3 100644
--- a/doc/ikiwiki/pagespec.mdwn
+++ b/doc/ikiwiki/pagespec.mdwn
@@ -71,7 +71,7 @@ SandBox", since no page can match both expressions.
 
 If you want to include only one level of subpages, you can use
 
-      blog/* and !blog/*/*
+    blog/* and !blog/*/*
 
 More complex expressions can also be created, by using parentheses for
 grouping. For example, to match pages in a blog that are tagged with either

example for inlining only one level of subpages
diff --git a/doc/ikiwiki/pagespec.mdwn b/doc/ikiwiki/pagespec.mdwn
index 0f298ad78..9045d032d 100644
--- a/doc/ikiwiki/pagespec.mdwn
+++ b/doc/ikiwiki/pagespec.mdwn
@@ -69,6 +69,10 @@ want to combine expression like that; "or" when it's enough for a page to
 match one expression. Note that it doesn't make sense to say "index and
 SandBox", since no page can match both expressions.
 
+If you want to include only one level of subpages, you can use
+
+      blog/* and !blog/*/*
+
 More complex expressions can also be created, by using parentheses for
 grouping. For example, to match pages in a blog that are tagged with either
 of two tags, use:

fail to inject IkiWiki::showform
diff --git a/doc/bugs/IkiWiki::showform_can_not_be_injected__63__.mdwn b/doc/bugs/IkiWiki::showform_can_not_be_injected__63__.mdwn
new file mode 100644
index 000000000..fd63f3eef
--- /dev/null
+++ b/doc/bugs/IkiWiki::showform_can_not_be_injected__63__.mdwn
@@ -0,0 +1,71 @@
+I want inject IkiWiki::showform and use replace submit button with translated button,
+but it seem no effect in cgi, does IkiWiki::showfrom can not be injectd when run as cgi?
+
+by the way, what about add a post-showform hook to ikiwiki?
+
+the below is my code:
+    
+    #!/usr/bin/perl
+    package IkiWiki::Plugin::chinesize;
+    
+    use warnings;
+    use strict;
+    use IkiWiki 3.00;
+    
+    inject(name => 'IkiWiki::showform', call => \&myshowform);
+    
+    sub myshowform ($$$$;@) {
+        	        my $form=prepform(@_);
+        	        shift;
+        	        my $buttons=shift;
+        	        my $session=shift;
+        	        my $cgi=shift;
+                    
+                    my $str=cgitemplate($cgi, $form->title,
+                                              $form->render(submit => $buttons), @_);
+                    
+                    my %names = ("Save Page" => "保存页面",
+                                 "Preview"   => "预览",
+                                 "Cancel"    => "取消",
+                                 "Diff"      => "差异比较",
+                                 "Rename"    => "重命名",
+                                 "Remove"    => "删除",
+                                 "Login"     => "登录",
+                                 "Register"  => "注册",
+                                 "Logout"    => "退出",
+                                 "Setup"     => "设置",
+                                 "Users"     => "所有用户",
+                                 "Name"      => "用户名",
+                                 "Password"  => "密码",
+                                 "Email"     => "电子邮件",
+                                 "Save Preferences"   => "保存选项",
+                                 "Confirm Password"   => "再次输入密码",
+                                 "Create Account"     => "创建帐户",
+                                 "Reset Password"     => "重置密码",
+                                 "Insert Links"       => "插入链接",
+                                 "Rename Attachment"  => "重命名附件",
+                                 "Remove Attachments" => "删除附件",
+                                 "FormattingHelp"     => "格式帮助",
+                                 "Reset"              => "重置",
+                                 "Save Setup"         => "保存设置",
+                                 "Advanced Mode"      => "高级模式",
+                                 "Account Creation Password" => "请输入帐户创建密码(管理员预设)"
+                                 );
+                    
+                    foreach my $old_name (keys(%names))
+                    {
+                    my $new_name = Encode::decode_utf8($names{$old_name});
+                    $str =~ s/<input +id="([_A-Za-z0-9]+)" +name="([_A-Za-z0-9]+)" +type="([_A-Za-z0-9]+)" +value="($old_name)" +\/>/<button id="$1" name="$2" type="$3" value="$4">$new_name<\/button>/g;
+                    $str =~ s/<input +name="([_A-Za-z0-9]+)" +type="([_A-Za-z0-9]+)" +value="($old_name)" +\/>/<button name="$1" type="$2" value="$3">$new_name<\/button>/g;
+                    $str =~ s/<input +class="([_A-Za-z0-9]+)" +id="([_A-Za-z0-9]+)" +name="([_A-Za-z0-9]+)" +type="([_A-Za-z0-9]+)" +value="($old_name)" +\/>/<button class="$1" id="$2" name="$3" type="$4" value="$5">$new_name<\/button>/g;
+                    $str =~ s/<div class="([_A-Za-z0-9]+)" id="([_A-Za-z0-9]+)">$old_name<\/div>/<div class="$1" id="$2">$new_name<\/div>/g;
+                    $str =~ s/<div class="([_A-Za-z0-9]+)" id="([_A-Za-z0-9]+)"><span class="([_A-Za-z0-9]+)">$old_name<\/span><\/div>/<div class="$1" id="$2"><span class="$3">$new_name<\/span><\/div>/g;
+                    $str =~ s/<a href="\.\/ikiwiki\/formatting\/">($old_name)<\/a>/<a href="\.\/ikiwiki\/formatting\/">$new_name<\/a>/g;
+                    };
+                    
+        	        printheader($session);
+        	        print $str
+                    
+                    }
+                    
+    

patch works for me
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index d9ca6ec1f..dc94db596 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -81,6 +81,6 @@ The below patch seem to deal with this problem:
     -- 
     2.19.0
     
+----
 
-    
-
+I can confirm that the above patch fixes the issue for me. Thanks! I'm not an ikiwiki committer, but I would encourage them to consider the above. Whilst I'm at it, I would be *really* grateful for some input on [[todo/support_multi-row_table_headers]] which relates to the same plugin. [[Jon]]

ack
diff --git a/doc/todo/Let_table_plugin_support_a_kind_of_long_table.mdwn b/doc/todo/Let_table_plugin_support_a_kind_of_long_table.mdwn
index 825a55403..fd25c0826 100644
--- a/doc/todo/Let_table_plugin_support_a_kind_of_long_table.mdwn
+++ b/doc/todo/Let_table_plugin_support_a_kind_of_long_table.mdwn
@@ -10,3 +10,5 @@ Instead of oddmuse style longtable, we can use YAML as table format:
     -
       a: 3
       b: 4
+
+> I think this is a great idea. It could be handled in the existing [[plugins/table]] plugin, with a new format= parameter. YAML sounds more attractive to me than oddmuse. -- [[Jon]]

rename and remove plug can not work well with gettext
diff --git a/doc/bugs/rename_and_remove_plug_can_not_work_well_with_gettext.mdwn b/doc/bugs/rename_and_remove_plug_can_not_work_well_with_gettext.mdwn
new file mode 100644
index 000000000..803e864f7
--- /dev/null
+++ b/doc/bugs/rename_and_remove_plug_can_not_work_well_with_gettext.mdwn
@@ -0,0 +1,3 @@
+I have found that the gettext string can not be translated to Chinese
+when I set LC_ALL to zh_CN.UTF-8
+

diff --git a/doc/todo/Let_table_plugin_support_a_kind_of_long_table.mdwn b/doc/todo/Let_table_plugin_support_a_kind_of_long_table.mdwn
index fa54a975e..825a55403 100644
--- a/doc/todo/Let_table_plugin_support_a_kind_of_long_table.mdwn
+++ b/doc/todo/Let_table_plugin_support_a_kind_of_long_table.mdwn
@@ -1,6 +1,6 @@
 When we edit a table with many many columns, use csv or dsv format is
 not comfortable to work, what about let table plugin support a format
-like (oddmuse longtable plug)[https://oddmuse.org/download/oddmuse-2.3.13/tables-long.pl] 
+like [oddmuse longtable plug](https://oddmuse.org/download/oddmuse-2.3.13/tables-long.pl) 
 
 Instead of oddmuse style longtable, we can use YAML as table format:
 

Suggest let table plugin support a kind of longtable
diff --git a/doc/todo/Let_table_plugin_support_a_kind_of_long_table.mdwn b/doc/todo/Let_table_plugin_support_a_kind_of_long_table.mdwn
new file mode 100644
index 000000000..fa54a975e
--- /dev/null
+++ b/doc/todo/Let_table_plugin_support_a_kind_of_long_table.mdwn
@@ -0,0 +1,12 @@
+When we edit a table with many many columns, use csv or dsv format is
+not comfortable to work, what about let table plugin support a format
+like (oddmuse longtable plug)[https://oddmuse.org/download/oddmuse-2.3.13/tables-long.pl] 
+
+Instead of oddmuse style longtable, we can use YAML as table format:
+
+    -
+      a: 1
+      b: 2
+    -
+      a: 3
+      b: 4

diff --git a/doc/bugs/About___37__2F_problem.mdwn b/doc/bugs/About___37__2F_problem.mdwn
index e915d0f3a..f855485d2 100644
--- a/doc/bugs/About___37__2F_problem.mdwn
+++ b/doc/bugs/About___37__2F_problem.mdwn
@@ -63,7 +63,5 @@ not deal with Chinese char, the below link can work
     2.19.0
     
 
-2.19.0
-
 
 

Add a patch deal with UTF-8 csv table's problem
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index fe71686e6..d9ca6ec1f 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -34,3 +34,53 @@ The below example works well too
 >> A related problem, also fixed by using DSV, is messing up the encoding of non-ASCII, non-wide characters, e.g. £ (workaround was to use &amp;pound; instead) -- [[Jon]]
 
 >>> Sorry, I have faced the same error: \[[!table Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.24/Encode.pm line 243.]] -- [[tumashu1]]
+
+---
+
+The below patch seem to deal with this problem:
+
+    From d6ed90331b31e4669222c6831f7a0f40f0677fe1 Mon Sep 17 00:00:00 2001
+    From: Feng Shu <tumashu@163.com>
+    Date: Sun, 2 Dec 2018 08:41:39 +0800
+    Subject: [PATCH 2/2] Fix table plugin can handle UTF-8 csv format
+    
+    ---
+     IkiWiki/Plugin/table.pm | 3 ++-
+     1 file changed, 2 insertions(+), 1 deletion(-)
+    
+    From ad1a92c796d907ad293e572a168b6e9a8219623f Mon Sep 17 00:00:00 2001
+    From: Feng Shu <tumashu@163.com>
+    Date: Sun, 2 Dec 2018 08:41:39 +0800
+    Subject: [PATCH 2/2] Fix table plugin can handle UTF-8 csv format
+    
+    ---
+     IkiWiki/Plugin/table.pm | 3 ++-
+     1 file changed, 2 insertions(+), 1 deletion(-)
+    
+    diff --git a/IkiWiki/Plugin/table.pm b/IkiWiki/Plugin/table.pm
+    index f3c425a37..7fea8ab1c 100644
+    --- a/IkiWiki/Plugin/table.pm
+    +++ b/IkiWiki/Plugin/table.pm
+    @@ -135,6 +135,7 @@ sub split_csv ($$) {
+     	my $csv = Text::CSV->new({ 
+     		sep_char	=> $delimiter,
+     		binary		=> 1,
+    +		decode_utf8 => 1,
+     		allow_loose_quotes => 1,
+     	}) || error("could not create a Text::CSV object");
+     	
+    @@ -143,7 +144,7 @@ sub split_csv ($$) {
+     	foreach my $line (@text_lines) {
+     		$l++;
+     		if ($csv->parse($line)) {
+    -			push(@data, [ map { decode_utf8 $_ } $csv->fields() ]);
+    +			push(@data, [ $csv->fields() ]);
+     		}
+     		else {
+     			debug(sprintf(gettext('parse fail at line %d: %s'), 
+    -- 
+    2.19.0
+    
+
+    
+

Add a patch decode_utf8 inline's root page
diff --git a/doc/bugs/About___37__2F_problem.mdwn b/doc/bugs/About___37__2F_problem.mdwn
index bb021efb4..e915d0f3a 100644
--- a/doc/bugs/About___37__2F_problem.mdwn
+++ b/doc/bugs/About___37__2F_problem.mdwn
@@ -32,3 +32,38 @@ not deal with Chinese char, the below link can work
 > Ideally either the `inline` directive or the `blog` request handler would
 > understand and remove `./`, if it's something that makes sense in this context.
 > --[[smcv]]
+
+---
+
+> I have found the problem, it is inline plugin can not decode_utf8 "from", the below is patch:
+
+    From f79dde20b275707f70df2d481919a079abec6c19 Mon Sep 17 00:00:00 2001
+    From: Feng Shu <tumashu@163.com>
+    Date: Sun, 2 Dec 2018 08:38:34 +0800
+    Subject: [PATCH 1/2] Fix inline plugin can no set rootpage to a UTF-8 page
+    
+    ---
+     IkiWiki/Plugin/inline.pm | 2 +-
+     1 file changed, 1 insertion(+), 1 deletion(-)
+    
+    diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
+    index a85cd5d2f..f40956821 100644
+    --- a/IkiWiki/Plugin/inline.pm
+    +++ b/IkiWiki/Plugin/inline.pm
+    @@ -125,7 +125,7 @@ sub sessioncgi ($$) {
+     			error(gettext("please enter a page title"));
+     		}
+     		# if the page already exists, munge it to be unique
+    -		my $from=$q->param('from');
+    +		my $from=decode_utf8($q->param('from'));
+     		my $add="";
+     		while (exists $IkiWiki::pagecase{lc($from."/".$page.$add)}) {
+     			$add=1 unless length $add;
+    -- 
+    2.19.0
+    
+
+2.19.0
+
+
+

add redirection
diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
new file mode 100644
index 000000000..140ffbf70
--- /dev/null
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -0,0 +1 @@
+[[!meta redir="bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content"]]

rename bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn to bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn
diff --git a/doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn
similarity index 100%
rename from doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
rename to doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn
diff --git a/doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated/20180628-patch.txt b/doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content/20180628-patch.txt
similarity index 100%
rename from doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated/20180628-patch.txt
rename to doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content/20180628-patch.txt

update for rename of bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated/20180628-patch.txt to bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content/20180628-patch.txt
diff --git a/doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn b/doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn
index 547eba375..a926135b0 100644
--- a/doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn
+++ b/doc/bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file__44___not_translated_content.mdwn
@@ -37,7 +37,7 @@ This would result in the following translation:
     This is the inlined content.
     This is the inlined content.
 
-[[Initially proposed patch from Chris Lamb|bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated/20180628-patch.txt]]
+[[Initially proposed patch from Chris Lamb|bugs/po:_second_or_subsequent_inline_of_translated_page_inlines_.po_file,_not_translated_content/20180628-patch.txt]]
 
 [[!tag patch]]
 

update for rename of todo/Re-use_translated_content_instead_of_skipping_if_previously_translated/20180628-patch.txt to bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated/20180628-patch.txt
diff --git a/doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
index 89074f79a..547eba375 100644
--- a/doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
+++ b/doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -37,7 +37,7 @@ This would result in the following translation:
     This is the inlined content.
     This is the inlined content.
 
-[[Initially proposed patch from Chris Lamb|20180628-patch.txt]]
+[[Initially proposed patch from Chris Lamb|bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated/20180628-patch.txt]]
 
 [[!tag patch]]
 

rename todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn to bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
similarity index 100%
rename from doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
rename to doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated/20180628-patch.txt b/doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated/20180628-patch.txt
similarity index 100%
rename from doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated/20180628-patch.txt
rename to doc/bugs/Re-use_translated_content_instead_of_skipping_if_previously_translated/20180628-patch.txt

refer to a branch
diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
index 3763cd9b0..89074f79a 100644
--- a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -170,3 +170,10 @@ commit was actually relevant to `po` users?
 Naming is the easy part of this review: the `alreadyfiltered` family of
 functions are not named like cache getter/setter functions. This could
 be resolved by renaming.
+
+---
+
+[[!template id=gitbranch branch=smcv/wip/po-filter-every-time browse="https://git.pseudorandom.co.uk/smcv/ikiwiki.git/log/refs/heads/wip/po-filter-every-time" author="[[Simon_McVittie|smcv]]"]]
+
+If it's valid to remove the `alreadyfiltered` mechanism, my
+`wip/po-filter-every-time` branch does that. Please test?

ikiwiki.info doesn't have fenced code blocks yet
diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
index e0dec5cfa..3763cd9b0 100644
--- a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -108,14 +108,12 @@ Looking back at the history of the `po` plugin, it seems that the
 `alreadyfiltered` mechanism was introduced (under a different name,
 with less abstraction) by [[intrigeri]] in commit 1e874b3f:
 
-```
-po plugin[filter]: avoid converting more than once per destfile
+    po plugin[filter]: avoid converting more than once per destfile
 
-Only the first filter function call on a given {page,destpage} must convert it
-from the PO file, subsequent calls must leave the passed $content unmodified.
+    Only the first filter function call on a given {page,destpage} must convert it
+    from the PO file, subsequent calls must leave the passed $content unmodified.
 
-Else, preprocessing loops are the rule.
-```
+    Else, preprocessing loops are the rule.
 
 I don't understand this. Under what circumstances would we pass content
 through the filter hooks, and then pass it back through the same filter

Escape directives in code
diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
index 0483f2c10..e0dec5cfa 100644
--- a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -5,13 +5,13 @@ copyright headers!) being inserted into the page instead.
 
 For example, given a "index.mdwn" containing:
 
-    [[!inline pages="inline" raw="yes"]]
-    [[!inline pages="inline" raw="yes"]]
+    \[[!inline pages="inline" raw="yes"]]
+    \[[!inline pages="inline" raw="yes"]]
 
 … and an "index.de.po" of:
 
-    msgid "[[!inline pages=\"inline\" raw=\"yes\"]]\n"
-    msgstr "[[!inline pages=\"inline.de\" raw=\"yes\"]]\n"
+    msgid "\[[!inline pages=\"inline\" raw=\"yes\"]]\n"
+    msgstr "\[[!inline pages=\"inline.de\" raw=\"yes\"]]\n"
 
 … together with an "inline.mdwn" of:
 

Review
diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
index 749551ccc..0483f2c10 100644
--- a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -1,99 +1,53 @@
-    From: Chris Lamb <lamby@debian.org>
-    Date: Thu, 28 Jun 2018 19:30:15 +0100
-    Subject: [PATCH] Re-use translated content instead of skipping if previously
-     translated.
-    
-    This fixes an issue where an initial `inline` directive would be translated
-    correctly, but subsequent inlines of the same would result in the raw
-    contents of the `.po` file being inserted into the page instead.
-    
-    For example, given a `index.mdwn` containing:
-    
-        \[[!inline pages="inline" raw="yes"]]
-        \[[!inline pages="inline" raw="yes"]]
-    
-    .. and an `index.de.po` of:
-    
-        msgid "\[[!inline pages=\"inline\" raw=\"yes\"]]\n"
-        msgstr "\[[!inline pages=\"inline.de\" raw=\"yes\"]]\n"
-    
-    .. together with an `inline.mdwn` of:
-    
-       This is inlined content.
-    
-    .. and an `inline.de.po` of:
-    
-        msgid "This is inlined content."
-        msgstr "This is German inlined content."
-    
-    .. would result in the following translation:
-    
-        This is the inlined content.
-        # SOME DESCRIPTIVE TITLE
-        # Copyright (C) YEAR Free Software Foundation, Inc.
-        # This file is distributed under the same license as the PACKAGE package.
-        # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-    
-    .. instead of, of course:
-    
-        This is the inlined content.
-        This is the inlined content.
-    ---
-     IkiWiki/Plugin/po.pm | 15 +++++++++------
-     1 file changed, 9 insertions(+), 6 deletions(-)
-    
-    diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
-    index 418e8e58a..ecd1f5499 100644
-    --- a/IkiWiki/Plugin/po.pm
-    +++ b/IkiWiki/Plugin/po.pm
-    @@ -303,9 +303,12 @@ sub filter (@) {
-     	my $page = $params{page};
-     	my $destpage = $params{destpage};
-     	my $content = $params{content};
-    -	if (istranslation($page) && ! alreadyfiltered($page, $destpage)) {
-    -		$content = po_to_markup($page, $content);
-    -		setalreadyfiltered($page, $destpage);
-    +	if (istranslation($page)) {
-    +		if (!defined(alreadyfiltered($page, $destpage))) {
-    +			$content = po_to_markup($page, $content);
-    +			setalreadyfiltered($page, $destpage, $content);
-    +		}
-    +		$content = alreadyfiltered($page, $destpage);
-     	}
-     	return $content;
-     }
-    @@ -747,15 +750,15 @@ sub myisselflink ($$) {
-     		my $page=shift;
-     		my $destpage=shift;
-     
-    -		return exists $filtered{$page}{$destpage}
-    -			 && $filtered{$page}{$destpage} eq 1;
-    +		return $filtered{$page}{$destpage};
-     	}
-     
-     	sub setalreadyfiltered($$) {
-     		my $page=shift;
-     		my $destpage=shift;
-    +		my $content=shift;
-     
-    -		$filtered{$page}{$destpage}=1;
-    +		$filtered{$page}{$destpage}=$content;
-     	}
-     
-     	sub unsetalreadyfiltered($$) {
-    -- 
-    2.18.0
-    
+There is an issue where an initial "inline" directive would be
+translated correctly but subsequent inlines of the same page would
+result in the raw contents of the ".po" file (ie. starting with the raw
+copyright headers!) being inserted into the page instead.
+
+For example, given a "index.mdwn" containing:
+
+    [[!inline pages="inline" raw="yes"]]
+    [[!inline pages="inline" raw="yes"]]
+
+… and an "index.de.po" of:
+
+    msgid "[[!inline pages=\"inline\" raw=\"yes\"]]\n"
+    msgstr "[[!inline pages=\"inline.de\" raw=\"yes\"]]\n"
+
+… together with an "inline.mdwn" of:
+
+   This is inlined content.
+
+… and an "inline.de.po" of:
+
+    msgid "This is inlined content."
+    msgstr "This is German inlined content."
+
+§
+
+This would result in the following translation:
+
+    This is the inlined content.
+    # SOME DESCRIPTIVE TITLE
+    # Copyright (C) YEAR Free Software Foundation, Inc.
+    # This file is distributed under the same license as the PACKAGE package.
+    # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+
+… instead of (of course)
+
+    This is the inlined content.
+    This is the inlined content.
+
+[[Initially proposed patch from Chris Lamb|20180628-patch.txt]]
+
 [[!tag patch]]
 
 > Thank you Chris! I've reviewed the patch (with my "original author of the po plugin" hat on) and it looks good to me. I'm not 100% sure about `alreadyfiltered` being the best name for something that's not a predicated anymore but it's good enough. Then I wore my end-user hat and confirmed that with Chris' patch applied, the reproducer we had for this bug at Tails works fine. So IMO we're good to go and I recommend to apply this patch. Thanks in advance! -- [[intrigeri]]
 
-
 > Any update on getting this merged? — [[lamby]], Fri, 24 Aug 2018 12:36:37 +0200
 
 > Indeed, would love to see this merged! What might be the next steps here? — [[lamby]],  Thu, 18 Oct 2018 17:57:37 -0400
 
-> I've filed this in Debian GNU/Linux at https://bugs.debian.org/911356 — [[lamby]], Thu, 18 Oct 2018 20:18:58 -0400
+> I've filed this in Debian GNU/Linux at <https://bugs.debian.org/911356> — [[lamby]], Thu, 18 Oct 2018 20:18:58 -0400
 
 >> As I said on the Debian bug, I think we badly need test coverage for
 >> this sort of thing, otherwise it *will* regress. The po plugin is
@@ -103,5 +57,118 @@
 >> bugs) without anyone realising.
 >>
 >> For now I've added a failing test-case for this particular bug.
->> I'll try to review this soon and understand the po plugin, the patch,
->> why the bug exists and why the patch fixes it. --[[smcv]]
+>> --[[smcv]]
+
+---
+
+Review from [[smcv]]:
+
+The patch attached to the Debian bug and the patch pasted here (which
+I've moved to an attachment) appear to be different, but I'm not going to
+do a line-by-line review of the patches and their differences for now
+because I'm not sure their approach is fully correct.
+
+As we know, the two hardest things in computer science are naming, cache
+invalidation and off-by-one errors. Unfortunately this patch has issues
+with naming and cache invalidation. It's effectively turning the
+`alreadyfiltered` mechanism into a cache of memoized results of calling
+`po_to_markup()` on pages' content, keyed by the page name and the
+`destpage`, which is either the page name again or the name of a page
+into which the `page` is to be inlined (even though the result of
+`po_to_markup()` doesn't actually vary with the `destpage`).
+
+This naturally raises the usual concerns about having a cache:
+
+* How large does it grow?
+* Do we invalidate it every time we need to?
+* Do we even need it?
+
+The cache size is mainly a concern for large wikis being rebuilt. If you
+have a wiki with 1000 translated pages in 3 languages each, each of which
+is inlined into an average of one other page, then by the time you finish
+a rebuild you'll be holding 6000 translated pages in memory. If we change
+the `alreadyfiltered` mechanism to be keyed by the page name and not the
+(page, destpage) pair, that drops to 3000, but that's still
+O(pages \* languages) which seems like a lot. As a general design
+principle, ikiwiki tries not to hold full content in RAM for more than
+the currently-processed page.
+
+We invalidate the `alreadyfiltered` for a (page, page) pair in an
+editcontent hook, and we never invalidate (page, destpage) pairs for
+page != destpage at all. Are we sure there is no other circumstance in
+which the content of a page can change?
+
+One of the things I tried doing for a simple solution was to remove the
+cache altogether, because I wasn't sure why we had this `alreadyfiltered`
+mechanism in the first place. This passes tests, which suggests that
+either the `alreadyfiltered` mechanism is unnecessary, or our regression
+test coverage for `po` is insufficient.
+
+Looking back at the history of the `po` plugin, it seems that the

(Diff truncated)
Fix broken link in basewiki
Links from pages in the basewiki (which is also a subset of ikiwiki's
own wiki) to pages on ikiwiki's own wiki have to use [[!iki]] so that
they will not become broken links when the page in question is copied
into other installations.
Detected by ./t/basewiki_brokenlinks.t.
diff --git a/doc/ikiwiki/directive/meta.mdwn b/doc/ikiwiki/directive/meta.mdwn
index 89a32946a..777712f32 100644
--- a/doc/ikiwiki/directive/meta.mdwn
+++ b/doc/ikiwiki/directive/meta.mdwn
@@ -77,7 +77,8 @@ a quote in the text by writing `&quot;` and so on.
 
   Specifies the creation date of the page. This creates a 
   `<meta name="date" content="...">` header in the HTML output, but also
-  modifies the internal `ctime` in the [[internal index|tips/inside_dot_ikiwiki/]].
+  modifies the internal `ctime` in the
+  [[!iki tips/inside_dot_ikiwiki desc="internal index"]].
   The date can be entered in nearly any format, since it's parsed by
   [[!cpan TimeDate]] but invalid dates yield an error in 3.20180321
   or later.

po: Add failing test for Debian bug #911356
diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
index 57386ad75..749551ccc 100644
--- a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -95,5 +95,13 @@
 
 > I've filed this in Debian GNU/Linux at https://bugs.debian.org/911356 — [[lamby]], Thu, 18 Oct 2018 20:18:58 -0400
 
-
-
+>> As I said on the Debian bug, I think we badly need test coverage for
+>> this sort of thing, otherwise it *will* regress. The po plugin is
+>> relatively complicated and hooks into lots of places in ikiwiki,
+>> and I don't think any of the active ikiwiki maintainers use it
+>> themselves, which means it can easily break (or have pre-existing
+>> bugs) without anyone realising.
+>>
+>> For now I've added a failing test-case for this particular bug.
+>> I'll try to review this soon and understand the po plugin, the patch,
+>> why the bug exists and why the patch fixes it. --[[smcv]]
diff --git a/t/po.t b/t/po.t
index 0db56edc9..3e9b9b7fd 100755
--- a/t/po.t
+++ b/t/po.t
@@ -3,6 +3,7 @@
 use warnings;
 use strict;
 use File::Temp qw{tempdir};
+use utf8;
 
 BEGIN {
 	unless (eval { require Locale::Po4a::Chooser }) {
@@ -17,7 +18,7 @@ BEGIN {
 	}
 }
 
-use Test::More tests => 114;
+use Test::More;
 
 BEGIN { use_ok("IkiWiki"); }
 
@@ -44,7 +45,7 @@ $config{po_slave_languages} = {
 			       es => 'Castellano',
 			       fr => "Français"
 			      };
-$config{po_translatable_pages}='index or test1 or test2 or translatable';
+$config{po_translatable_pages}='index or test1 or test2 or translatable or debian*';
 $config{po_link_to}='negotiated';
 IkiWiki::loadplugins();
 ok(IkiWiki::loadplugin('meta'), "meta plugin loaded");
@@ -67,8 +68,15 @@ $pagesources{'translatable'}='translatable.mdwn';
 $pagesources{'translatable.fr'}='translatable.fr.po';
 $pagesources{'translatable.es'}='translatable.es.po';
 $pagesources{'nontranslatable'}='nontranslatable.mdwn';
+$pagesources{'debian911356'}='debian911356.mdwn';
+$pagesources{'debian911356.fr'}='debian911356.fr.po';
+$pagesources{'debian911356-inlined'}='debian911356-inlined.mdwn';
+$pagesources{'debian911356-inlined.fr'}='debian911356-inlined.fr.po';
+my $now=time;
 foreach my $page (keys %pagesources) {
 	$IkiWiki::pagecase{lc $page}=$page;
+	$IkiWiki::pagectime{$page}=$now;
+	$IkiWiki::pagemtime{$page}=$now;
 }
 
 ### populate srcdir
@@ -80,6 +88,42 @@ writefile('test2.mdwn', $config{srcdir}, 'test2 content');
 writefile('test3.mdwn', $config{srcdir}, 'test3 content');
 writefile('translatable.mdwn', $config{srcdir}, '[[nontranslatable]]');
 writefile('nontranslatable.mdwn', $config{srcdir}, '[[/]] [[translatable]]');
+writefile('debian911356.mdwn', $config{srcdir}, <<EOF);
+Before first inline
+
+[[!inline pages="debian911356-inlined" raw="yes"]]
+
+Between inlines
+
+[[!inline pages="debian911356-inlined" raw="yes"]]
+
+After inlines
+EOF
+writefile('debian911356-inlined.mdwn', $config{srcdir}, <<EOF);
+English content
+EOF
+writefile('debian911356.fr.po', $config{srcdir}, <<EOF);
+msgid "" msgstr ""
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+
+msgid "Before first inline"
+msgstr "Avant la première inline"
+
+msgid "[[!inline pages=\\"debian911356-inlined\\" raw=\\"yes\\"]]\\n"
+msgstr "[[!inline pages=\\"debian911356-inlined.fr\\" raw=\\"yes\\"]]\\n"
+
+msgid "Between inlines"
+msgstr "Entre les inlines"
+
+msgid "After inlines"
+msgstr "Après les inlines"
+EOF
+writefile('debian911356-inlined.fr.po', $config{srcdir}, <<EOF);
+msgid "English content"
+msgstr "Contenu français"
+EOF
 
 ### istranslatable/istranslation
 # we run these tests twice because memoization attempts made them
@@ -248,3 +292,68 @@ ok(IkiWiki::Plugin::po::islanguagecode('es'));
 ok(IkiWiki::Plugin::po::islanguagecode('arn'));
 ok(! IkiWiki::Plugin::po::islanguagecode('es_'));
 ok(! IkiWiki::Plugin::po::islanguagecode('_en'));
+
+# Actually render translated pages
+use IkiWiki::Render;
+
+my %output;
+foreach my $page (keys %pagesources) {
+	my $source = "$config{srcdir}/$pagesources{$page}";
+	if (-e $source) {
+		IkiWiki::scan($pagesources{$page});
+		my $content = readfile($source);
+		print STDERR "-------------------------------------\n";
+		#print STDERR "SOURCE: $page: $content\n";
+		$content = IkiWiki::filter($page, $page, $content);
+		#print STDERR "FILTERED: $page: $content\n";
+		$content = IkiWiki::preprocess($page, $page, $content);
+		#print STDERR "PREPROCESSED: $page: $content\n";
+		$content = IkiWiki::linkify($page, $page, $content);
+		#print STDERR "LINKIFIED: $page: $content\n";
+		$content = IkiWiki::htmlize($page, $page, IkiWiki::pagetype($pagesources{$page}), $content);
+		print STDERR "HTMLIZED: $page: $content\n";
+		$output{$page} = $content;
+		ok(utf8::is_utf8($content), "htmlized content should be utf8");
+	}
+}
+
+like($output{debian911356}, qr{
+	<p>Before\sfirst\sinline</p>
+	\s*
+	<p>English\scontent</p>
+	\s*
+	<p>Between\sinlines</p>
+	\s*
+	<p>English\scontent</p>
+	\s*
+	<p>After\sinlines</p>
+}sx);
+
+like($output{'debian911356.fr'}, qr{
+	<p>Avant\sla\spremière\sinline</p>
+	\s*
+	<p>Contenu\sfrançais</p>
+	\s*
+	<p>Entre\sles\sinlines</p>
+	\s*
+	.*	# TODO: This paragraph gets mangled (Debian #911356)
+	\s*
+	<p>Après\sles\sinlines</p>
+}sx);
+
+TODO: {
+local $TODO = "Debian bug #911356";
+like($output{'debian911356.fr'}, qr{
+	<p>Avant\sla\spremière\sinline</p>
+	\s*
+	<p>Contenu\sfrançais</p>
+	\s*
+	<p>Entre\sles\sinlines</p>
+	\s*
+	<p>Contenu\sfrançais</p>
+	\s*
+	<p>Après\sles\sinlines</p>
+}sx);
+};
+
+done_testing;

I don't think the Chinese text causes this
diff --git a/doc/bugs/About___37__2F_problem.mdwn b/doc/bugs/About___37__2F_problem.mdwn
index 4b5ae384d..bb021efb4 100644
--- a/doc/bugs/About___37__2F_problem.mdwn
+++ b/doc/bugs/About___37__2F_problem.mdwn
@@ -21,3 +21,14 @@ I have found that it is not "%2F"'s problem, it just that inline directive can
 not deal with Chinese char, the below link can work
 
     http://172.16.0.109/ikiwiki.cgi?do=blog&from=aaa%2Fbugs&subpage=1&title=aaa
+
+---
+
+> I don't think this is actually caused by the Chinese text. The problem is that
+> you used `rootpage="./bugs"`, which leads to the `blog` request handler
+> generating an invalid page name. If you change it to `rootpage="bugs"` does
+> that fix the error?
+>
+> Ideally either the `inline` directive or the `blog` request handler would
+> understand and remove `./`, if it's something that makes sense in this context.
+> --[[smcv]]

comments (no review yet)
diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
index 957ff3f9a..ff3cb8d36 100644
--- a/doc/plugins/osm/discussion.mdwn
+++ b/doc/plugins/osm/discussion.mdwn
@@ -71,6 +71,31 @@ rather not have to carry around a local copy of his work to get a map
 with waypoints on my HTTPS site. [[smcv]], can you spare some round
 tuits to give us your thoughts? --[[schmonz]]
 
+> I've never used the osm plugin, so I don't know how well it works at the moment.
+> I think the lack of test coverage has been a significant factor in it not actually
+> working. Even if we don't have test-driven development, the next best thing is
+> bug-driven testing: every time something regresses, we should have a test that
+> asserts it doesn't fail like that again.
+>
+> If the current osm plugin is at all usable, then we'd need to look at the specific
+> ways in which the new one is incompatible, but if the current osm plugin doesn't
+> actually work anyway, then the new one can't break working sites...
+>
+> Determining whether there's HTML injection is certainly an important thing to
+> review. We need to be able to say what's trusted, what's attacker-controlled, and
+> what was originally attacker-controlled but has been sanitized or escaped and
+> hence has reached a trusted state.
+>
+> As an upstream developer, I would say that my preferred approach to Leaflet would
+> be to vendor it and use the vendored copy by default, but have a configuration
+> parameter to load it from a CDN instead. In the Debian package, to avoid the
+> situation we've got into with jQuery where we have a vendored copy that we
+> don't dare to update to a new version because we don't know what it will break,
+> I think there should be a dependency on libjs-leaflet and a dpkg trigger to
+> copy its files into our underlay (ideally we'd symlink it, but ikiwiki doesn't
+> follow symlinks, and I don't think an approach to symlinks in underlays that
+> isn't a security flaw is going to happen any time soon). --[[smcv]]
+
 ----
 
 Just stumbled onto this. 

Revert spam
This reverts commit c600ed0e710d82601acf5ae4005b940f5cba8c08
diff --git a/doc/forum/How_to_install_Text:Multimarkdown__63__/comment_2_5192a5348ee10fc35349cac1b1e6f61f._comment b/doc/forum/How_to_install_Text:Multimarkdown__63__/comment_2_5192a5348ee10fc35349cac1b1e6f61f._comment
deleted file mode 100644
index c0fee9c30..000000000
--- a/doc/forum/How_to_install_Text:Multimarkdown__63__/comment_2_5192a5348ee10fc35349cac1b1e6f61f._comment
+++ /dev/null
@@ -1,8 +0,0 @@
-[[!comment format=html
- username="luciferwhite"
- avatar="http://cdn.libravatar.org/avatar/f29fd1395f5b340e1d257a0923467c53"
- subject="Re: How to understand the process of installation"
- date="2018-07-27T17:13:04Z"
- content="""
-You have to great to know the proper way of installing the part which will be more productive for the developer to find out the exact part which is going to take the best way to somehow need the perfect guide <a href=\"https://supportprop58.com/windows-10-audio-crackling/\">windows 10 sound crackling</a> that will show you the perfect process to install the multilayer .
-"""]]

diff --git a/doc/bugs/About___37__2F_problem.mdwn b/doc/bugs/About___37__2F_problem.mdwn
index 9a8fed22f..4b5ae384d 100644
--- a/doc/bugs/About___37__2F_problem.mdwn
+++ b/doc/bugs/About___37__2F_problem.mdwn
@@ -14,3 +14,10 @@ Its url include a %2F, like below:
 > http://172.16.0.109/ikiwiki.cgi?do=blog&from=.%2Fbugs&subpage=1&title=aaa
 
 I use ikiwiki 3.20180311
+
+----
+
+I have found that it is not "%2F"'s problem, it just that inline directive can
+not deal with Chinese char, the below link can work
+
+    http://172.16.0.109/ikiwiki.cgi?do=blog&from=aaa%2Fbugs&subpage=1&title=aaa

diff --git a/doc/bugs/About___37__2F_problem.mdwn b/doc/bugs/About___37__2F_problem.mdwn
new file mode 100644
index 000000000..9a8fed22f
--- /dev/null
+++ b/doc/bugs/About___37__2F_problem.mdwn
@@ -0,0 +1,16 @@
+I use inline to create a blog like the below:
+
+    \[[!inline pages="./bugs/* and !./bugs/done and !./bugs/discussion and 
+    !link(patch) and !link(./bugs/done) and !./bugs/*/*"
+    actions=yes rootpage="./bugs" postform="yes" postformtext="请用一句话简述问题,然后点击 Edit 按钮添加具体细节" show=0]]
+
+
+When I use posform to add a new page, it show:
+
+> Error: bad page name 
+
+Its url include a %2F, like below:
+
+> http://172.16.0.109/ikiwiki.cgi?do=blog&from=.%2Fbugs&subpage=1&title=aaa
+
+I use ikiwiki 3.20180311

diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index 89f406d5d..fe71686e6 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -32,3 +32,5 @@ The below example works well too
 > That file is owned by the `libperl5` package, but I think I've seen an error mentioning `Text::CSV` i.e. `libtext-csv-perl` when I've encountered this before. -- [[Jon]]
 
 >> A related problem, also fixed by using DSV, is messing up the encoding of non-ASCII, non-wide characters, e.g. £ (workaround was to use &amp;pound; instead) -- [[Jon]]
+
+>>> Sorry, I have faced the same error: \[[!table Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.24/Encode.pm line 243.]] -- [[tumashu1]]

related issue
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index d0031fecf..89f406d5d 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -30,3 +30,5 @@ The below example works well too
     [\[!table Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.24/Encode.pm line 243.]]
 
 > That file is owned by the `libperl5` package, but I think I've seen an error mentioning `Text::CSV` i.e. `libtext-csv-perl` when I've encountered this before. -- [[Jon]]
+
+>> A related problem, also fixed by using DSV, is messing up the encoding of non-ASCII, non-wide characters, e.g. £ (workaround was to use &amp;pound; instead) -- [[Jon]]

error output when trying
diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index 69d184702..d0031fecf 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -22,3 +22,11 @@ The below example works well too
     1,2,你好
     """
     ]]
+
+----
+
+> You don't say what actually happens when you try this, but I hit something similar trying unicode symbols in a CSV-based table. (I wasn't aware of the DSV work-around. Thanks!) The specific error  I get trying is
+
+    [\[!table Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.24/Encode.pm line 243.]]
+
+> That file is owned by the `libperl5` package, but I think I've seen an error mentioning `Text::CSV` i.e. `libtext-csv-perl` when I've encountered this before. -- [[Jon]]

rename postvote to postlink
This better explains what it contains, which is a wikilink to the page
to go to after posting the vote. And postlink is more consistent a name
with posttrail.
diff --git a/CHANGELOG b/CHANGELOG
index 892dca041..cb7a7a038 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -10,7 +10,7 @@ ikiwiki (3.20180312) UNRELEASED; urgency=medium
   [ Joey Hess ]
   * aggregate: Fix aggregation of posts without a title.
     Thanks, Alexandre Oliva
-  * poll: Added postvote and posttrail options for better multi-page polls.
+  * poll: Added postlink and posttrail options for better multi-page polls.
 
  -- Simon McVittie <smcv@debian.org>  Wed, 16 May 2018 13:09:27 +0100
 
diff --git a/IkiWiki/Plugin/poll.pm b/IkiWiki/Plugin/poll.pm
index 734fe487e..5a09e2087 100644
--- a/IkiWiki/Plugin/poll.pm
+++ b/IkiWiki/Plugin/poll.pm
@@ -69,8 +69,8 @@ sub preprocess (@) {
 			$ret.="<input type=\"hidden\" name=\"num\" value=\"$num\" />\n";
 			$ret.="<input type=\"hidden\" name=\"page\" value=\"$params{page}\" />\n";
 			$ret.="<input type=\"hidden\" name=\"choice\" value=\"$choice\" />\n";
-			if (defined $params{postvote}) {
-				$ret.="<input type=\"hidden\" name=\"postvote\" value=\"".linkpage($params{postvote})."\" />\n";
+			if (defined $params{postlink}) {
+				$ret.="<input type=\"hidden\" name=\"postlink\" value=\"".linkpage($params{postlink})."\" />\n";
 			}
 			if (defined $params{posttrail}) {
 				$ret.="<input type=\"hidden\" name=\"posttrail\" value=\"".linkpage($params{posttrail})."\" />\n";
@@ -119,8 +119,8 @@ sub sessioncgi ($$) {
 		}
 
 		my $postvote=urlto($page);
-		if (defined $cgi->param('postvote') && length $cgi->param('postvote')) {
-			$postvote=urlto(bestlink($page, $cgi->param('postvote')));
+		if (defined $cgi->param('postlink') && length $cgi->param('postlink')) {
+			$postvote=urlto(bestlink($page, $cgi->param('postlink')));
 		}
 		elsif (defined $cgi->param('posttrail') && length $cgi->param('posttrail')) {
 			my $trailname=bestlink($page, $cgi->param('posttrail'));
diff --git a/doc/ikiwiki/directive/poll.mdwn b/doc/ikiwiki/directive/poll.mdwn
index 7b9fdfdc5..caaeaeaf0 100644
--- a/doc/ikiwiki/directive/poll.mdwn
+++ b/doc/ikiwiki/directive/poll.mdwn
@@ -23,7 +23,7 @@ Parameters:
   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".
-* `postvote` - By default after voting the updated page containing the poll
+* `postlink` - By default after voting the updated page containing the poll
   is displayed. This parameter allows advancing onward to another page.
   This is useful for multi-page polls.
 * `posttrail` - Similar to postvote, but allows advancing to the next page

poll: Added postvote and posttrail options for better multi-page polls.
Modern web users probably expect the poll to move on automatically to the
next question, and this allows for that behavior.
Note that bestlink() runs at vote time, which avoids needing to make the
page containing the poll depend on the page that sets up a trail, as the
current trail at vote time will be used.
This commit was sponsored by Eric Drechsel on Patreon.
diff --git a/CHANGELOG b/CHANGELOG
index b00dc8218..892dca041 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -10,6 +10,7 @@ ikiwiki (3.20180312) UNRELEASED; urgency=medium
   [ Joey Hess ]
   * aggregate: Fix aggregation of posts without a title.
     Thanks, Alexandre Oliva
+  * poll: Added postvote and posttrail options for better multi-page polls.
 
  -- Simon McVittie <smcv@debian.org>  Wed, 16 May 2018 13:09:27 +0100
 
diff --git a/IkiWiki/Plugin/poll.pm b/IkiWiki/Plugin/poll.pm
index eb0e6ef04..734fe487e 100644
--- a/IkiWiki/Plugin/poll.pm
+++ b/IkiWiki/Plugin/poll.pm
@@ -69,6 +69,12 @@ sub preprocess (@) {
 			$ret.="<input type=\"hidden\" name=\"num\" value=\"$num\" />\n";
 			$ret.="<input type=\"hidden\" name=\"page\" value=\"$params{page}\" />\n";
 			$ret.="<input type=\"hidden\" name=\"choice\" value=\"$choice\" />\n";
+			if (defined $params{postvote}) {
+				$ret.="<input type=\"hidden\" name=\"postvote\" value=\"".linkpage($params{postvote})."\" />\n";
+			}
+			if (defined $params{posttrail}) {
+				$ret.="<input type=\"hidden\" name=\"posttrail\" value=\"".linkpage($params{posttrail})."\" />\n";
+			}
 			$ret.="<input type=\"submit\" value=\"".gettext("vote")."\" />\n";
 		}
 		$ret.="</p>\n<hr class=poll align=left width=\"$percent%\"/>\n";
@@ -112,13 +118,25 @@ sub sessioncgi ($$) {
 			error("bad page name");
 		}
 
+		my $postvote=urlto($page);
+		if (defined $cgi->param('postvote') && length $cgi->param('postvote')) {
+			$postvote=urlto(bestlink($page, $cgi->param('postvote')));
+		}
+		elsif (defined $cgi->param('posttrail') && length $cgi->param('posttrail')) {
+			my $trailname=bestlink($page, $cgi->param('posttrail'));
+			my $trailnext=$pagestate{$page}{trail}{item}{$trailname}[1];
+			if (defined $trailnext) {
+				$postvote=urlto($trailnext);
+			}
+		}
+
 		# Did they vote before? If so, let them change their vote,
 		# and check for dups.
 		my $choice_param="poll_choice_${page}_$num";
 		my $oldchoice=$session->param($choice_param);
 		if (defined $oldchoice && $oldchoice eq $choice) {
 			# Same vote; no-op.
-			IkiWiki::redirect($cgi, urlto($page));
+			IkiWiki::redirect($cgi, $postvote);
 			exit;
 		}
 
@@ -149,7 +167,7 @@ sub sessioncgi ($$) {
 		};
 		$content =~ s{(\\?)\[\[\Q$prefix\E\s+([^]]+)\s*\]\]}{$edit->($1, $2)}seg;
 
-		# Store their vote, update the page, and redirect to it.
+		# Store their vote, update the page, and redirect.
 		writefile($pagesources{$page}, $config{srcdir}, $content);
 		$session->param($choice_param, $choice);
 		IkiWiki::cgi_savesession($session);
@@ -174,8 +192,7 @@ sub sessioncgi ($$) {
 		eval q{use CGI::Cookie};
 		error($@) if $@;
 		my $cookie = CGI::Cookie->new(-name=> $session->name, -value=> $session->id);
-		print $cgi->redirect(-cookie => $cookie,
-			-url => urlto($page));
+		print $cgi->redirect(-cookie => $cookie, -url => $postvote);
 		exit;
 	}
 }
diff --git a/doc/ikiwiki/directive/poll.mdwn b/doc/ikiwiki/directive/poll.mdwn
index 0b47a2167..7b9fdfdc5 100644
--- a/doc/ikiwiki/directive/poll.mdwn
+++ b/doc/ikiwiki/directive/poll.mdwn
@@ -23,5 +23,12 @@ Parameters:
   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".
+* `postvote` - By default after voting the updated page containing the poll
+  is displayed. This parameter allows advancing onward to another page.
+  This is useful for multi-page polls.
+* `posttrail` - Similar to postvote, but allows advancing to the next page
+  on a trail after a vote. The value of the parameter is the name of the
+  page that defines the trail to follow. The trail plugin must be
+  enabled for this to work.
 
 [[!meta robots="noindex, follow"]]

diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index a943081cb..69d184702 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -17,7 +17,7 @@ But the below example works well.
 
 The below example works well too
 
-    [[!table format=dsv delimiter=, data="""
+    \[[!table format=dsv delimiter=, data="""
     a,b,c
     1,2,你好
     """

diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
index e3980293b..a943081cb 100644
--- a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -13,3 +13,12 @@ But the below example works well.
     1,2,3
     """
     ]]
+
+
+The below example works well too
+
+    [[!table format=dsv delimiter=, data="""
+    a,b,c
+    1,2,你好
+    """
+    ]]

diff --git a/doc/bugs/table_can_not_deal_with_Chinese_.mdwn b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
new file mode 100644
index 000000000..e3980293b
--- /dev/null
+++ b/doc/bugs/table_can_not_deal_with_Chinese_.mdwn
@@ -0,0 +1,15 @@
+Table directive can not deal with Chinese, when format csv
+
+    \[[!table format=csv data="""
+    a,b,c
+    1,2,你好
+    """
+    ]]
+
+But the below example works well.
+
+    \[[!table format=csv data="""
+    a,b,c
+    1,2,3
+    """
+    ]]

avoiding ban?
diff --git a/doc/todo/anti-spam_protection.mdwn b/doc/todo/anti-spam_protection.mdwn
index c653ab30a..cf07fe7eb 100644
--- a/doc/todo/anti-spam_protection.mdwn
+++ b/doc/todo/anti-spam_protection.mdwn
@@ -55,3 +55,36 @@ That removed 2265 comments. I reviewed the remaining 643 by hand and deleted the
 Now, I don't want to point fingers, but there sure seems to be some problems with china there and i'm tempted to just block those entire networks. :/
 
 Anyways... Someone mentioned Spamassassin in the original request, and I just [read](https://lwn.net/SubscriberLink/769917/130e156925fc690e/) that some people *are* using spamassassin for website spam control. Has anyone gave that a try? --[[anarcat]]
+
+----
+
+Another note that might be of interest here... One of the things that script was doing was to generate a list of IPs to be inserted into `ikiwiki.setup`. Unfortunately, that doesn't seem to work:
+
+    $ ~anarcat/bin/ikiwiki-comment-moderate 
+    found 165 pending comments
+    IP distribution:
+          1  ip="110.86.179.146"
+    [...]
+         10  ip="175.44.35.10"
+         11  ip="175.44.35.236"
+    banlist would look like:
+    - ip(110.86.179.146)
+    # 112.111.162.159 already present
+    # 112.111.163.216 already present
+    [...]
+    # 36.250.185.52 already present
+    # 36.250.185.55 already present
+    # 36.250.186.113 already present
+    - ip(59.60.123.211)
+    to remove comments from a specific IP, use this, for example:
+    find . -name '*._comment_pending' | xargs grep -l 'ip="$ip"'| xargs rm
+    to flush all pending comments, use:
+    find . -name '*._comment_pending' -delete
+
+In other words, many of the comments in moderation are actually
+supposed to be blocked, as their IPs are in the `banned_users`
+list. Now I know my way around a UNIX system well enough to deal with
+this another way - I'm thinking of fail2ban or a simple Apache rewrite
+table (and it might easier and faster too) - but I wonder why those
+IPs can still post comments when they are listed in
+`banned_users`... -- [[anarcat]]

update my entry
diff --git a/doc/git.mdwn b/doc/git.mdwn
index 5286f83dc..0f959a2c3 100644
--- a/doc/git.mdwn
+++ b/doc/git.mdwn
@@ -70,7 +70,7 @@ think about merging them. This is recommended. :-)
 * [[users/leg]] `git://at.magma-soft.at/ikiwiki.info`
 * [[thcipriani]] `https://github.com/thcipriani/ikiwiki.git` ([[browse|https://github.com/thcipriani/ikiwiki]])
 * [[tincho]] `git@github.com:TheTincho/ikiwiki.git` ([[browse|https://github.com/TheTincho/ikiwiki]])
-* hefee `https://salsa.debian.org/hefee/ikiwiki`
+* [[hefee]] `https://salsa.debian.org/hefee/ikiwiki.git/` ([[browse|https://salsa.debian.org/hefee/ikiwiki]])
 ## branches
 
 Current branches of ikiwiki are listed on [[branches]].

update description & remove tag patch
diff --git a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
index aecfa68d3..e3a57e184 100644
--- a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
+++ b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
@@ -1,7 +1,9 @@
-[[!tag patch]]
 [[!template  id=gitbranch branch=feature/15355-po-plugin-disable-languages author="[[hefee]]"]]
 
-In order to be able to prepare more translations before publishing them, it is a good a idea to have disabled languages.
-Currently there are some small issues that need to cleanup before able to push this into ikiwiki upstream.
+`po_disabled_languages` is used to disable languages on the website. It
+can be used to prepare new translations, while it will hide those from
+the end-user. More precisely, PO files for these languages are updated
+normally, however, HTML creation will be disabled and no reference to
+these translations will be visible on the website.
 
 See also downstream bug report in tails: <https://labs.riseup.net/code/issues/15355>

more spam issues. this is definitely not done.
diff --git a/doc/todo/anti-spam_protection.mdwn b/doc/todo/anti-spam_protection.mdwn
index f0c6c19b6..c653ab30a 100644
--- a/doc/todo/anti-spam_protection.mdwn
+++ b/doc/todo/anti-spam_protection.mdwn
@@ -34,3 +34,24 @@ to check for common spam signatures. --[[Joey]]
 I am sorry to say that neither those solutions are sufficient for a site that allows anonymous comments. blogspam lets thousands of commits through here, as i described in [[todo/commandline_comment_moderation]]. Now, maybe I didn't configure blogspam correctly, I am not sure. I just enabled the plugin and set `blogspam_pagespec: postcomment(blog/*) or */discussion`. I have also imported the blocklist from this wiki's ikiwiki.setup, generated from [[spam_fighting]]. I have had to add around 10 IPs to that list already.
 
 It seems to me a list of blocked URLs or blocked IPs as mentionned above would be an interesting solution. blogspam is great, but the API doesn't seem to support reporting IPs or bad content back, which seems to be a major problem in working around false negatives. I'm tempted to just remove the `done` tag above, because this is clearly not fixed for me here... --[[anarcat]]
+
+----
+
+Update, ~3 years later... Situation hasn't improved much. If anything, things are worse now as [blogspam](https://blogspam.net/) was [almost shutdown](https://blog.steve.fi/possibly_retiring_blogspam_net.html). It's still up, but it's unclear if it's doing anything. I just went through comment moderation for about 3000 comments, all of which were spam, except *one*. And the only reason I went there is because I *asked* someone to comment on a blog post instead of writing me privately so I *knew* there was something for me there. That was more than 5 months of comments backlog, and it was obviously too much to review by hand, so I removed things according to some patterns. For example, anything with phpBB-like markup is probably spam, so I cleared those up:
+
+    find .  -name '*._comment_pending' -a -print0  | xargs -0 grep -l -Z '\[url=' | xargs -0 rm
+
+That removed 2265 comments. I reviewed the remaining 643 by hand and deleted them all. I used [ikiwiki-comment-moderate](https://gitlab.com/anarcat/scripts/blob/master/ikiwiki-comment-moderate) to generate a list of IPs to block. The top 5 /16 blocks were:
+
+    18 112.5 China Mobile communications corporation
+    31 110.89 Chinanet
+    36 36.250 China Unicom
+    44 112.111 China Unicom
+    45 36.248 China Unicom
+    74 175.44 China Unicom
+
+(Left column is the number of IPs affected in the /16. Middle is the /16. Right is an assertion of the owner.) Attacks came from 104 distinct /24 blocks and 66 distinct /16.
+
+Now, I don't want to point fingers, but there sure seems to be some problems with china there and i'm tempted to just block those entire networks. :/
+
+Anyways... Someone mentioned Spamassassin in the original request, and I just [read](https://lwn.net/SubscriberLink/769917/130e156925fc690e/) that some people *are* using spamassassin for website spam control. Has anyone gave that a try? --[[anarcat]]

Give graph an optional "file" param, like table's.
diff --git a/IkiWiki/Plugin/graphviz.pm b/IkiWiki/Plugin/graphviz.pm
index d4018edaa..479da6f73 100644
--- a/IkiWiki/Plugin/graphviz.pm
+++ b/IkiWiki/Plugin/graphviz.pm
@@ -95,6 +95,14 @@ sub render_graph (\%) {
 sub graph (@) {
 	my %params=@_;
 
+	if (exists $params{file}) {
+		if (! exists $pagesources{$params{file}}) {
+			error gettext("cannot find file");
+		}
+		$params{src} = readfile(srcfile($params{file}));
+		add_depends($params{page}, $params{file});
+	}
+
 	# Support wikilinks in the graph source.
 	my $src=$params{src};
 	$src="" unless defined $src;
diff --git a/doc/ikiwiki/directive/graph.mdwn b/doc/ikiwiki/directive/graph.mdwn
index 7021e47fb..1463420d7 100644
--- a/doc/ikiwiki/directive/graph.mdwn
+++ b/doc/ikiwiki/directive/graph.mdwn
@@ -21,6 +21,7 @@ ikiwiki, [[WikiLinks|ikiwiki/wikilink]] can also be used. For example:
 The `graph` directive supports the following parameters:
 
 - `src` - The graphviz source to render.
+* `file` - A file in the wiki containing the graphviz source.
 - `type` - The type of graph to render: `graph` or `digraph`.  Defaults to
   `digraph`.
 - `prog` - The graphviz program to render with: `dot`, `neato`, `fdp`, `twopi`,

diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
index a03259c03..57386ad75 100644
--- a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -93,4 +93,7 @@
 
 > Indeed, would love to see this merged! What might be the next steps here? — [[lamby]],  Thu, 18 Oct 2018 17:57:37 -0400
 
+> I've filed this in Debian GNU/Linux at https://bugs.debian.org/911356 — [[lamby]], Thu, 18 Oct 2018 20:18:58 -0400
+
+
 

diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
index 1260ce19f..a03259c03 100644
--- a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -91,4 +91,6 @@
 
 > Any update on getting this merged? — [[lamby]], Fri, 24 Aug 2018 12:36:37 +0200
 
+> Indeed, would love to see this merged! What might be the next steps here? — [[lamby]],  Thu, 18 Oct 2018 17:57:37 -0400
+
 

removed
diff --git a/doc/forum/An_assets_directory_for_my_wiki_with_git_lfs_or_annex__63__/comment_8_8ecc48807d369a5b5cf0ce3abcbddbc4._comment b/doc/forum/An_assets_directory_for_my_wiki_with_git_lfs_or_annex__63__/comment_8_8ecc48807d369a5b5cf0ce3abcbddbc4._comment
deleted file mode 100644
index 377d57d46..000000000
--- a/doc/forum/An_assets_directory_for_my_wiki_with_git_lfs_or_annex__63__/comment_8_8ecc48807d369a5b5cf0ce3abcbddbc4._comment
+++ /dev/null
@@ -1,8 +0,0 @@
-[[!comment format=mdwn
- username="DataComputist"
- avatar="http://cdn.libravatar.org/avatar/a17d83194742f0bd57df1e9fc6858c8f"
- subject="Could someone document the steps to achieve this?"
- date="2018-10-16T07:01:52Z"
- content="""
-I have the exact same need. My Ikiwiki instance containing hundreds of megabytes of photos have a huge Git history, and ikiwiki refresh takes a really long time (>7 mins). I really need help.
-"""]]

Added a comment: Could someone document the steps to achieve this?
diff --git a/doc/forum/An_assets_directory_for_my_wiki_with_git_lfs_or_annex__63__/comment_8_8ecc48807d369a5b5cf0ce3abcbddbc4._comment b/doc/forum/An_assets_directory_for_my_wiki_with_git_lfs_or_annex__63__/comment_8_8ecc48807d369a5b5cf0ce3abcbddbc4._comment
new file mode 100644
index 000000000..377d57d46
--- /dev/null
+++ b/doc/forum/An_assets_directory_for_my_wiki_with_git_lfs_or_annex__63__/comment_8_8ecc48807d369a5b5cf0ce3abcbddbc4._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="DataComputist"
+ avatar="http://cdn.libravatar.org/avatar/a17d83194742f0bd57df1e9fc6858c8f"
+ subject="Could someone document the steps to achieve this?"
+ date="2018-10-16T07:01:52Z"
+ content="""
+I have the exact same need. My Ikiwiki instance containing hundreds of megabytes of photos have a huge Git history, and ikiwiki refresh takes a really long time (>7 mins). I really need help.
+"""]]

another thing to remove from prints
diff --git a/doc/todo/hide_add_comment_button_in_print.mdwn b/doc/todo/hide_add_comment_button_in_print.mdwn
new file mode 100644
index 000000000..cbfaca888
--- /dev/null
+++ b/doc/todo/hide_add_comment_button_in_print.mdwn
@@ -0,0 +1,48 @@
+[[!template  id=gitbranch branch=anarcat/print-no-comment author="[[anarcat]]"]]
+
+Print versions are often a neglected part of a style sheet, but it's
+great when people can actually print your webpage and get a satisfying
+result.
+
+This often means removing a bunch of stuff that are irrelevant for
+print. Ikiwiki already does a bunch of those things in the
+base stylesheet:
+
+    /* things to hide in printouts */
+    @media print {
+    	.actions { display: none; }
+    	.tags { display: none; }
+    	.trails { display: none; }
+    	.feedbutton { display: none; }
+    	#searchform { display: none; }
+    	.blogform, #blogform { display: none; }
+    	#backlinks { display: none; }
+    }
+
+But I think we should remove more. In particular, the `addcomment`
+button is not relevant at all for print versions. There might be more:
+in my [bootstrap theme][], I also had to [remove][] the whole footer,
+because it was overlapping with the page content. It's unfortunate
+because it removes the copyright notice, but I don't know how else to
+fix this.
+
+Anyways, how about [this patch][]?
+
+    --- a/doc/style.css
+    +++ b/doc/style.css
+    @@ -286,6 +286,7 @@ div.progress-done {
+     	#searchform { display: none; }
+     	.blogform, #blogform { display: none; }
+     	#backlinks { display: none; }
+    +	.addcomment { display: none; }
+     }
+     
+     /* infobox template */
+
+Thanks! -- [[anarcat]]
+
+[bootstrap theme]: https://gitlab.com/anarcat/ikiwiki-bootstrap-anarcat
+[remove]: https://gitlab.com/anarcat/ikiwiki-bootstrap-anarcat/commit/94521766f4206882c44764253452ec666d90d5c1
+[this patch]: https://gitlab.com/anarcat/ikiwiki/commit/33630b561623b8dca946916b733807e9b8c97849.patch
+
+[[!tag patch]]

Added a comment: More thoughts about Ikiwiki
diff --git a/doc/forum/Some_thoughts_about_Ikiwiki/comment_2_d1026de462b7491ce2ed2f72f08d463a._comment b/doc/forum/Some_thoughts_about_Ikiwiki/comment_2_d1026de462b7491ce2ed2f72f08d463a._comment
new file mode 100644
index 000000000..e411f462f
--- /dev/null
+++ b/doc/forum/Some_thoughts_about_Ikiwiki/comment_2_d1026de462b7491ce2ed2f72f08d463a._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="spalax"
+ avatar="http://cdn.libravatar.org/avatar/3f1353e4135221fc25bfecd1b812bcc8"
+ subject="More thoughts about Ikiwiki"
+ date="2018-10-10T14:43:32Z"
+ content="""
+I eventually switched my [website](http://ababsurdo.fr) to [lektor](http://getlektor.com). It is more modern than ikiwiki (and written in Python, so its easier for me to dig into the code). Here are more thoughts about Ikiwiki, compared to Lektor.
+
+- Ikiwiki community is great! Even these days, when there is very few activity, when people ask for help (either on this website, or on IRC), they get quick answers (as opposed to Lektor, where I had to wait up to six weeks to get an answer (not blaming lektor contributors: I know they have a life too, and owe me nothing: just congratulating Ikiwiki contributors)).
+- Ikiwiki does not hide errors! Several times, with Lektor, I scratched my head, not understanding why some stuff silently didn't work.
+- I think this has been mentionned elsewhere, but Ikiwiki hard-coded templates make it hard/impossible to change some simple things.
+
+I am a bit sad no longer using Ikiwiki. I like the project and the people behind it. Thanks a lot!
+"""]]

About the unmaintained compile plugin
diff --git a/doc/plugins/contrib/compile/discussion.mdwn b/doc/plugins/contrib/compile/discussion.mdwn
index fbf9f22ea..1cad06128 100644
--- a/doc/plugins/contrib/compile/discussion.mdwn
+++ b/doc/plugins/contrib/compile/discussion.mdwn
@@ -50,3 +50,98 @@ command...
 > Any thoughts?
 >
 > -- [[Louis|spalax]]
+
+---
+
+<span id="status">
+# This plugin is unmaintained
+</span>
+
+Unfortunately, since [[I am no longer using Ikiwiki|forum/Some_thoughts_about_Ikiwiki/]], this plugin is unmaintained. I had great ideas for a new version of this plugin (and [started some work](https://atelier.gresille.org/projects/gresille-ikiwiki/repository?utf8=%E2%9C%93&rev=compile2)), but I will not finish this work. I am dumping my TODO list for this plugin (in French) for those who might be interested.
+
+[[!toggle id="TODO" text="See the TODO list."]]
+
+[[!toggleable id="TODO" text="""
+  - [ ] Ajouter un test slideshow avec un minimum de code utilisateur
+    - http://slidesjs.com/
+    - https://stackoverflow.com/questions/12912048/how-to-maintain-aspect-ratio-using-html-img-tag
+  - [x] Faire aussi des tests qui utilisent le YAML du setup
+  - [ ] Se déparrasser des ``DEST_XXX_URL``.
+  - [ ] Se débarrasser des listes de ``config[destname]``.
+  - [x] supprimer source, nosource.
+  - [x] Voir si on supprime `make`
+  - [ ] Voir si la configuration ne peut pas se faire en YAML
+    - [x] Non
+    - [ ] Utiliser du YAML.
+  - [ ] Renommer
+    - [ ] type = rule
+    - [ ] destname = dest
+    - [ ] filenames = src
+    - [ ] ??
+  - [ ] Parser correctement la configuration (fichier de setup + arguments de la directive)
+  - [ ] Traiter src comme un pagespec? Au moins comme un glob?
+  - [ ] Variables :
+    - Génériques :
+      - pagedir: sub/page
+      - tmpdir: /home/user/wiki/.ikiwiki/3840938038409
+      - wikidir: /home/user/wiki
+      - destdir: $config{destdir}
+      - id: un identifiant unique ?
+    - Fichiers :
+      - Variables
+        - PAS DE `SRC*`: TOUT DANS DEST
+        - destname: foo.pdf ($destbasename.$destextension)
+        - destbasename: foo
+        - destextension: pdf
+        - desturl: http://...foo.pdf
+        - destwikiname: sub/page/foo/foo.pdf ($dirname/$destname)
+        - destfullname: /var/www/wiki/sub/page/foo/foo.pdf ($destdir/$destwikiname)
+        - destcontent: contenu de foo.pdf
+      - Variations
+        - destname0, destname1: premier, deuxième fichier source
+        - idem pour les autres variables
+        - destnamelist: liste des fichiers sources, tels qu'accessibles depuis le répertoire temporaire (shell, pour la commande seulement)
+        - destlist: liste des fichiers sources (en utilisant HTML::Template, pour les templates seulement)
+  - [ ] Traiter ``destname`` comme un glob.
+    - [ ] Accéder au premier destname avec DESTNAME.
+    - [ ] Accéder à tous les destname avec DESTNAME0, DESTNAME1, etc.
+    - [ ] Accéder à une liste de destname utilisable dans un `<TMPL_LOOP>`
+  - [ ] Supprimer les fichiers temporaires au début.
+  - [ ] Créer des dossiers temporaires en fonction du hash de ``SOURCEPAGE/FILES/COMMAND``.
+  - [ ] Ne pas re-compiler si le répertoire existe déjà.
+  - [ ] destname ne renomme pas le fichier : il sélectionne quel fichier publier.
+  - [ ] Mais fournir des templates par défaut :
+    - [ ] `compile_source`
+    - [ ] `compile_link` (avec des `var_text` et `var_srctext`)
+    - [ ] `compile_album` (avec un `var_width` et `var_height` et un `slideshow.js` seulement en exemple)
+    - [ ] `compile_raw`
+  - [ ] Doc: Fournir des exemples de règles
+    - [ ] gimp, libreoffice, latex, album, etc.
+  - [ ] Le fichier source n'est pas copié par défaut: si on en a besoin, il faut le mentionner dans les destnames.
+  - [ ] Documentation
+    - [ ] Slideshow (sans compilation)
+    - [ ] Tous les moyens d'accéder aux fichiers (destname, destname0, destnamelist, destlist[destname], etc.)
+  - [ ] Ne pas charger compile2 si compile est activé
+    - [ ] Mettre une option pour forcer
+  - [ ] wikistate: stocker compilé/erreur (rien du tout = pas encore compilé)
+  - [ ] Ajouter un argument `page` pour faire comme si la commande était appelée depuis ladite page?
+  - [ ] Marquer compile comme obsolète
+    - [ ] Source
+    - [ ] Documentation sur ikiwiki
+    - [ ] Warning dans le code
+    - [ ] git tag compile/v0.2
+  - [ ] Prévenir que bibtex2html est obsolète
+"""]]
+
+---
+
+# Quick and dirty replacement
+
+For those how might be interested: I switched from Ikiwiki to [another static site generator](http://getlektor.com), which does not have a `compile` plugin. Before writing it, I used a quick and dirty solution: using a custom `Makefile`, I use `make build` to build my website, which :
+
+- compile the files (e.g. latex documents);
+- build the website.
+
+It started as a quick and dirty fix, but I think I am keeping it.
+
+It should work with Ikiwiki too.

fix user link
diff --git a/doc/todo/pagespec_aliases.mdwn b/doc/todo/pagespec_aliases.mdwn
index 6e52dcd53..396a93c0f 100644
--- a/doc/todo/pagespec_aliases.mdwn
+++ b/doc/todo/pagespec_aliases.mdwn
@@ -173,5 +173,5 @@ Unfortunately I haven't figured out how to do the dependencies - I'd really appr
 Hi, it's been 7 years since I last looked at this, and I'm surprised to find
 that I'd got it up to a merge-request state; I've dusted it off and done some
 clean up and testing, but it's working (albeit not via websetup). I've revamped
-the docs and rebased the branch. Can someone please consider merging ([[joeyh]]
+the docs and rebased the branch. Can someone please consider merging ([[joey]]
 or [[smcv]]?) or otherwise feed back on this? Thanks! — [[Jon]] (2018-09-25)

7 year ping: dusted off and ready for re-reviewing please
diff --git a/doc/todo/pagespec_aliases.mdwn b/doc/todo/pagespec_aliases.mdwn
index 748444a2f..6e52dcd53 100644
--- a/doc/todo/pagespec_aliases.mdwn
+++ b/doc/todo/pagespec_aliases.mdwn
@@ -167,3 +167,11 @@ Unfortunately I haven't figured out how to do the dependencies - I'd really appr
 >>>>> Do you mean that you want them to work in any pagespec, or that you *don't* want them to work in any pagespec? -- [[KathrynAndersen]]
 
 >>>>>> I mean I would want them to work in any pagespec. — [[Jon]]
+
+----
+
+Hi, it's been 7 years since I last looked at this, and I'm surprised to find
+that I'd got it up to a merge-request state; I've dusted it off and done some
+clean up and testing, but it's working (albeit not via websetup). I've revamped
+the docs and rebased the branch. Can someone please consider merging ([[joeyh]]
+or [[smcv]]?) or otherwise feed back on this? Thanks! — [[Jon]] (2018-09-25)

+done
diff --git a/doc/todo/monochrome_theme.mdwn b/doc/todo/monochrome_theme.mdwn
index eaf51c080..50cbf25df 100644
--- a/doc/todo/monochrome_theme.mdwn
+++ b/doc/todo/monochrome_theme.mdwn
@@ -46,3 +46,5 @@ Perhaps controversially, I think that this would be a good basis for a default t
 >>>>>   so the impact is pretty small. (except perhaps if someone specifies an absolute
 >>>>>   `cgiurl` path?)  The additional customization is belt-and-braces.
 >>>>>   — [[Jon]]
+
+[[done]]

proposed reworking; requesting smcv take another look
diff --git a/doc/todo/support_multi-row_table_headers.mdwn b/doc/todo/support_multi-row_table_headers.mdwn
index 6f13bbb23..1d418a41b 100644
--- a/doc/todo/support_multi-row_table_headers.mdwn
+++ b/doc/todo/support_multi-row_table_headers.mdwn
@@ -77,3 +77,22 @@ It would be great if it were possible to support multi-row table headers in the
 > > addressed my immediate need so it's the one I'm deploying at $ork for the
 > > time being. I'm unlikely to have time to implement this solution in the
 > > near future. -- [[Jon]]
+
+----
+
+I'd quite like to revisit this if that's ok. I'm still carrying a fork of
+table.pm locally to add this feature as I find it so useful. The main objection
+you made back in 2014 seems to be overloading the header= parameter, and I agree
+that this is not ideal. So I'm happy to resubmit this with an alternative parameter
+name for the new purpose. But I balked at the idea of implementing something like 
+an NLP processor to define the header range. And I must stress how useful it is in
+practise to separate out the header definition from the data: quite often I don't
+want headers in my CSV files at all, for example, so I can perform rudimentary analysis
+on them with command line tools without having to factor in a header line (how many
+records?  = `wc -l`; sorting on fields simply with `sort -k` etc.). Having them
+separate means I can have machine-generated or manipulated CSV files of data and then
+use ikiwiki to mark them up for human reading, but change or regenerate the data quickly
+and easily underneath.
+
+I'd appreciate your take on the above suggestions [[smcv]] before I roll my sleeves up.
+Thanks! — [[Jon]] (2018-09-24)

ping - any opinions on this?
diff --git a/doc/todo/Modern_standard_layout.mdwn b/doc/todo/Modern_standard_layout.mdwn
index 64399b1b2..bb6356a6d 100644
--- a/doc/todo/Modern_standard_layout.mdwn
+++ b/doc/todo/Modern_standard_layout.mdwn
@@ -64,5 +64,10 @@ seems to be broken for edit/preview workflow. I might investigate/file about tha
                                                                                                                        
 I wonder if someone feels the same, since you defaulted to actiontabs on branchable.                                   
                                                                                                                        
-Thanks, [[users/Jon]].  (PS: Every log in method failed for me with Firefox Quantum
-trying to post this. Untrusted git push also failed.)
+Thanks, [[users/Jon]]. (2017-12-28)
+
+----
+
+9 month ping, does [[Joey]] or [[smcv]] have any kind of opinion on this matter,
+subsequent to my last comment? I ask because both of your takes on the issue are from
+way back in 2011. — [[Jon]] (2018-09-24)

pingbacks dead? webmentions instead?
diff --git a/doc/todo/pingback_support.mdwn b/doc/todo/pingback_support.mdwn
index 7b3b158ee..5d93e6094 100644
--- a/doc/todo/pingback_support.mdwn
+++ b/doc/todo/pingback_support.mdwn
@@ -39,3 +39,26 @@ case I will consider this done with an entry in [[tips]]; otherwise a
 > all urls found. --[[Joey]] 
 
 >> Is there any update on this? This would be highly useful and is the main reason why I am not using my blog more regularly, yet. (And yes, now that git-annex is doing everything I need and more, I thought I should revisit this one, as well). -- RichiH
+
+----
+
+Happy 9th anniversary, bug!
+
+For whatever reason I was compelled to look at this situation afresh. I've
+added some instrumentation to my own site to see whether there's any external
+attempts to issue pingbacks to my own site, to gauge whether it's worthwhile
+spending any more time on this. But it looks like pingback in the wider world
+might be dead or dying.
+
+[I started a conversation on Twitter with the inventor of Pingback to see what
+he thought](https://twitter.com/jmtd/status/1042730998839107585). He suggested
+taking a look at "webmentions". here's some preliminary reading on those:
+
+ * <https://indieweb.org/Webmention>
+ * <https://kryogenix.org/days/2014/11/29/enabling-webmentions/>
+ * <https://www.kryogenix.org/days/2014/11/30/vouching-for-webmentions-hashing-for-vouches/>
+
+At this point I don't know if webmentions actually has more traction than pingback,
+but the key issue I guess is whether it's growing. I'm going to (but am yet to) add
+corresponding instrumentation to my site to try and track that, too.
+-- [[Jon]] (2018-09-24)

diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
index 5736a2430..957ff3f9a 100644
--- a/doc/plugins/osm/discussion.mdwn
+++ b/doc/plugins/osm/discussion.mdwn
@@ -95,3 +95,5 @@ I've done some initial testing now and I'm wondering if behaviour has changed wi
 
 >>> What I meant was that you could add a wiki link (to a page with a map) next to each waypoint to simulate the old behaviour. 
 >>> Maps with subsets of waypoints, waypoint in multiple maps: no, because a single GeoJSON file is created for each "map". But something that could be added is the ability to merge multiple maps into one view, as separate layers. --[[users/tincho]]
+
+>>>> A wiki link to a map page will show the whole map zoomed out I presume so that won't be helful when I have pois across the globe and you want to know which side of a building the photo is taken from :( Merging maps would be a very good feature! If it could be done with a pagespec type thing it would be awesome. For my use case I could then have a map at each building page showing the locations of all the photos under that page. The map file would be reasonably small. If these maps could then be merged via a directive with globbing of some sort into a mega-map that would be a very flexibly solution that automatically updates when I add new maps (buildings). I just need to use my non-existent programming skills to force my hack plugins into automatically creating per album maps.  -[[users/kjs]]

separate another thread of discussion
diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
index b00f1b89d..5736a2430 100644
--- a/doc/plugins/osm/discussion.mdwn
+++ b/doc/plugins/osm/discussion.mdwn
@@ -85,6 +85,8 @@ Looks like good changes to me!
 
 > The issue about not getting all the waipoints until you rebuild has been solved, the current plugin had issues with keeping track of updated and deleted waypoints which is now fixed in my branch. --[[users/Tincho]]
 
+----
+
 I've done some initial testing now and I'm wondering if behaviour has changed with regards to the waypoint link. With the old plugin I get a map marker and link to the main map from each waypoint. See <http://img.kalleswork.net/Peter_Celsing-Filmhuset/IMGP7104/> for example, the marker is below the image. My initial tests with your plugin doesn't create this link as far as I can tell. Have I misconfigured something or is it indeed missing? --[[users/kjs]]
 
 > It is not there any more (I should document this, thanks for pointing it out). I thought that it was not good to have that marker inserted unconditionally; also, there is no full-page map any more with this plugin (which required a cgi mode). The alternative will be to have a page with the map, and adding a link to it. --[[users/Tincho]]

reply to question about new plugin
diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
index f9d6e8966..b00f1b89d 100644
--- a/doc/plugins/osm/discussion.mdwn
+++ b/doc/plugins/osm/discussion.mdwn
@@ -90,3 +90,6 @@ I've done some initial testing now and I'm wondering if behaviour has changed wi
 > It is not there any more (I should document this, thanks for pointing it out). I thought that it was not good to have that marker inserted unconditionally; also, there is no full-page map any more with this plugin (which required a cgi mode). The alternative will be to have a page with the map, and adding a link to it. --[[users/Tincho]]
 
 >> That's unfortunate for me as embedding a map on each page with a waypoint is a bit to expensive bandwidth wise. It will slow down the browsing to much. Are there any means of creating maps with subsets of waypoints. Perhaps tags somehow? Can a waypoint appear on multiple maps? I'm thinking having the waypoint appear on a central mega-map and on a sub map, In my case a per building map. Currently all my map info is automatically generated from the exif data. So I just upload the images to an underlay dir and git push my 'building' page which then generates an image gallery and a map of all my photos. I'm trying to avoid typing to much! ;) --[[users/kjs]]
+
+>>> What I meant was that you could add a wiki link (to a page with a map) next to each waypoint to simulate the old behaviour. 
+>>> Maps with subsets of waypoints, waypoint in multiple maps: no, because a single GeoJSON file is created for each "map". But something that could be added is the ability to merge multiple maps into one view, as separate layers. --[[users/tincho]]

rename branch to avoid conflict with upstream bootstrap branch
diff --git a/doc/plugins/contrib/bootstrap.mdwn b/doc/plugins/contrib/bootstrap.mdwn
index 9ed0af593..47b59cebd 100644
--- a/doc/plugins/contrib/bootstrap.mdwn
+++ b/doc/plugins/contrib/bootstrap.mdwn
@@ -1,7 +1,7 @@
 [[!meta author="anarcat"]]
 [[!template id=plugin name=bootstrap author="[[anarcat]]"]]
 [[!tag type/chrome]]
-[[!template  id=gitbranch branch=anarcat/bootstrap author="[[anarcat]]"]]
+[[!template  id=gitbranch branch=anarcat/bootstrap-plugin author="[[anarcat]]"]]
 
 ## Rationale
 

forgot to sign my comment
diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
index bb83a2b2c..f9d6e8966 100644
--- a/doc/plugins/osm/discussion.mdwn
+++ b/doc/plugins/osm/discussion.mdwn
@@ -89,4 +89,4 @@ I've done some initial testing now and I'm wondering if behaviour has changed wi
 
 > It is not there any more (I should document this, thanks for pointing it out). I thought that it was not good to have that marker inserted unconditionally; also, there is no full-page map any more with this plugin (which required a cgi mode). The alternative will be to have a page with the map, and adding a link to it. --[[users/Tincho]]
 
->> That's unfortunate for me as embedding a map on each page with a waypoint is a bit to expensive bandwidth wise. It will slow down the browsing to much. Are there any means of creating maps with subsets of waypoints. Perhaps tags somehow? Can a waypoint appear on multiple maps? I'm thinking having the waypoint appear on a central mega-map and on a sub map, In my case a per building map. Currently all my map info is automatically generated from the exif data. So I just upload the images to an underlay dir and git push my 'building' page which then generates an image gallery and a map of all my photos. I'm trying to avoid typing to much! ;)
+>> That's unfortunate for me as embedding a map on each page with a waypoint is a bit to expensive bandwidth wise. It will slow down the browsing to much. Are there any means of creating maps with subsets of waypoints. Perhaps tags somehow? Can a waypoint appear on multiple maps? I'm thinking having the waypoint appear on a central mega-map and on a sub map, In my case a per building map. Currently all my map info is automatically generated from the exif data. So I just upload the images to an underlay dir and git push my 'building' page which then generates an image gallery and a map of all my photos. I'm trying to avoid typing to much! ;) --[[users/kjs]]

diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
index be9c5c215..bb83a2b2c 100644
--- a/doc/plugins/osm/discussion.mdwn
+++ b/doc/plugins/osm/discussion.mdwn
@@ -88,3 +88,5 @@ Looks like good changes to me!
 I've done some initial testing now and I'm wondering if behaviour has changed with regards to the waypoint link. With the old plugin I get a map marker and link to the main map from each waypoint. See <http://img.kalleswork.net/Peter_Celsing-Filmhuset/IMGP7104/> for example, the marker is below the image. My initial tests with your plugin doesn't create this link as far as I can tell. Have I misconfigured something or is it indeed missing? --[[users/kjs]]
 
 > It is not there any more (I should document this, thanks for pointing it out). I thought that it was not good to have that marker inserted unconditionally; also, there is no full-page map any more with this plugin (which required a cgi mode). The alternative will be to have a page with the map, and adding a link to it. --[[users/Tincho]]
+
+>> That's unfortunate for me as embedding a map on each page with a waypoint is a bit to expensive bandwidth wise. It will slow down the browsing to much. Are there any means of creating maps with subsets of waypoints. Perhaps tags somehow? Can a waypoint appear on multiple maps? I'm thinking having the waypoint appear on a central mega-map and on a sub map, In my case a per building map. Currently all my map info is automatically generated from the exif data. So I just upload the images to an underlay dir and git push my 'building' page which then generates an image gallery and a map of all my photos. I'm trying to avoid typing to much! ;)

reply to question about new plugin
diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
index ed8cd27ee..be9c5c215 100644
--- a/doc/plugins/osm/discussion.mdwn
+++ b/doc/plugins/osm/discussion.mdwn
@@ -86,3 +86,5 @@ Looks like good changes to me!
 > The issue about not getting all the waipoints until you rebuild has been solved, the current plugin had issues with keeping track of updated and deleted waypoints which is now fixed in my branch. --[[users/Tincho]]
 
 I've done some initial testing now and I'm wondering if behaviour has changed with regards to the waypoint link. With the old plugin I get a map marker and link to the main map from each waypoint. See <http://img.kalleswork.net/Peter_Celsing-Filmhuset/IMGP7104/> for example, the marker is below the image. My initial tests with your plugin doesn't create this link as far as I can tell. Have I misconfigured something or is it indeed missing? --[[users/kjs]]
+
+> It is not there any more (I should document this, thanks for pointing it out). I thought that it was not good to have that marker inserted unconditionally; also, there is no full-page map any more with this plugin (which required a cgi mode). The alternative will be to have a page with the map, and adding a link to it. --[[users/Tincho]]

osm-tincho questions
diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
index fa313ee68..ed8cd27ee 100644
--- a/doc/plugins/osm/discussion.mdwn
+++ b/doc/plugins/osm/discussion.mdwn
@@ -84,3 +84,5 @@ Looks like good changes to me!
 --[[kjs]]
 
 > The issue about not getting all the waipoints until you rebuild has been solved, the current plugin had issues with keeping track of updated and deleted waypoints which is now fixed in my branch. --[[users/Tincho]]
+
+I've done some initial testing now and I'm wondering if behaviour has changed with regards to the waypoint link. With the old plugin I get a map marker and link to the main map from each waypoint. See <http://img.kalleswork.net/Peter_Celsing-Filmhuset/IMGP7104/> for example, the marker is below the image. My initial tests with your plugin doesn't create this link as far as I can tell. Have I misconfigured something or is it indeed missing? --[[users/kjs]]

diff --git a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
index 80d5634ff..aecfa68d3 100644
--- a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
+++ b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
@@ -4,4 +4,4 @@
 In order to be able to prepare more translations before publishing them, it is a good a idea to have disabled languages.
 Currently there are some small issues that need to cleanup before able to push this into ikiwiki upstream.
 
-See also downstream bug report in tails: https://labs.riseup.net/code/issues/15355
+See also downstream bug report in tails: <https://labs.riseup.net/code/issues/15355>

diff --git a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
index 5dc160be9..80d5634ff 100644
--- a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
+++ b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
@@ -2,4 +2,6 @@
 [[!template  id=gitbranch branch=feature/15355-po-plugin-disable-languages author="[[hefee]]"]]
 
 In order to be able to prepare more translations before publishing them, it is a good a idea to have disabled languages.
-Currently there are some small issues that need to cleanup before beeing able to push it into ikiwiki.
+Currently there are some small issues that need to cleanup before able to push this into ikiwiki upstream.
+
+See also downstream bug report in tails: https://labs.riseup.net/code/issues/15355

diff --git a/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
new file mode 100644
index 000000000..5dc160be9
--- /dev/null
+++ b/doc/todo/_Add_ikiwiki_PO-Plugin_to_ignore_languages.mdwn
@@ -0,0 +1,5 @@
+[[!tag patch]]
+[[!template  id=gitbranch branch=feature/15355-po-plugin-disable-languages author="[[hefee]]"]]
+
+In order to be able to prepare more translations before publishing them, it is a good a idea to have disabled languages.
+Currently there are some small issues that need to cleanup before beeing able to push it into ikiwiki.

add hefee git repostitory
diff --git a/doc/git.mdwn b/doc/git.mdwn
index fe778f606..5286f83dc 100644
--- a/doc/git.mdwn
+++ b/doc/git.mdwn
@@ -70,7 +70,7 @@ think about merging them. This is recommended. :-)
 * [[users/leg]] `git://at.magma-soft.at/ikiwiki.info`
 * [[thcipriani]] `https://github.com/thcipriani/ikiwiki.git` ([[browse|https://github.com/thcipriani/ikiwiki]])
 * [[tincho]] `git@github.com:TheTincho/ikiwiki.git` ([[browse|https://github.com/TheTincho/ikiwiki]])
-
+* hefee `https://salsa.debian.org/hefee/ikiwiki`
 ## branches
 
 Current branches of ikiwiki are listed on [[branches]].

Remove a website that is no longer generated using Ikiwiki
diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn
index 2ad84d82c..3a810a731 100644
--- a/doc/ikiwikiusers.mdwn
+++ b/doc/ikiwikiusers.mdwn
@@ -209,7 +209,6 @@ Personal sites and blogs
 * Kalle Söderman: [Seen Architecture](http://img.kalleswork.net), [Stockholm Project](http://stockholm.kalleswork.net) - Mainly -image galleries using the album and osm plugins with a customized html5 theme.
 * James Richardson's [wiki](https://jamestechnotes.com), [blog](https://jamesrichardson.name), and online [resume](https://resume.jamesrichardson.name).
 * [Amitai Schleier's site](https://schmonz.com/)
-* [[spalax]]'s [professional website](http://ababsurdo.fr)
 * [Aloodo Blog](http://blog.aloodo.org/)
 * Ninguém tem blog! - Restricted ikiwiki hosting
   * [Dissertos radicais](http://dissertosradicais.tem.blog.br)

diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
index 037b5925d..1260ce19f 100644
--- a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -87,3 +87,8 @@
 [[!tag patch]]
 
 > Thank you Chris! I've reviewed the patch (with my "original author of the po plugin" hat on) and it looks good to me. I'm not 100% sure about `alreadyfiltered` being the best name for something that's not a predicated anymore but it's good enough. Then I wore my end-user hat and confirmed that with Chris' patch applied, the reproducer we had for this bug at Tails works fine. So IMO we're good to go and I recommend to apply this patch. Thanks in advance! -- [[intrigeri]]
+
+
+> Any update on getting this merged? — [[lamby]], Fri, 24 Aug 2018 12:36:37 +0200
+
+

rename plugins/osm/Tincho.mdwn to users/Tincho.mdwn
diff --git a/doc/plugins/osm/Tincho.mdwn b/doc/users/Tincho.mdwn
similarity index 100%
rename from doc/plugins/osm/Tincho.mdwn
rename to doc/users/Tincho.mdwn

update for rename of plugins/osm/Tincho.mdwn to users/Tincho.mdwn
diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
index 05c2294c3..fa313ee68 100644
--- a/doc/plugins/osm/discussion.mdwn
+++ b/doc/plugins/osm/discussion.mdwn
@@ -28,9 +28,9 @@ For usability it would be great if it was possible to display the active waypoin
 
 ## Updated plugin needs review and merge
 
-[[!template id=gitbranch branch=tincho-osm author="[[tincho]]"]]
+[[!template id=gitbranch branch=tincho-osm author="[[users/Tincho]]"]]
 
-[[schmonz]] here. I recently tried to use this plugin, had some trouble, and discovered on IRC that [[tincho]] has a largely [rewritten version](https://blog.tincho.org/posts/OSM_in_IkiWiki/) that looks good [on his site](https://blog.tincho.org/Mingle/), but hadn't gotten around to submitting for merge. So we remote-paired on it today, improved a few things, and wrote down what we noticed:
+[[schmonz]] here. I recently tried to use this plugin, had some trouble, and discovered on IRC that [[users/Tincho]] has a largely [rewritten version](https://blog.tincho.org/posts/OSM_in_IkiWiki/) that looks good [on his site](https://blog.tincho.org/Mingle/), but hadn't gotten around to submitting for merge. So we remote-paired on it today, improved a few things, and wrote down what we noticed:
 
 ### Features removed
 
@@ -64,7 +64,7 @@ For usability it would be great if it was possible to display the active waypoin
 - Given this is backward-incompatible, dhould we call it something other than "osm"?
 - What needs scrubbing? Have we covered all the bases? Too many bases?
 - Should we vendor Leaflet into an underlay, instead of needing a URL to load it from a CDN? [[schmonz]] somewhat prefers this, so we avoid needing external resources by default, avoid breaking when the Leaflet CDN is down, etc.
-- Should we write some tests before merging? `osm.pm` hadn't had any, FWIW -- [[Tincho]] Done
+- Should we write some tests before merging? `osm.pm` hadn't had any, FWIW -- [[users/Tincho]] Done
 
 Bump! Tincho would like to see us merge his effort, and FWIW I'd also
 rather not have to carry around a local copy of his work to get a map
@@ -83,4 +83,4 @@ Looks like good changes to me!
 
 --[[kjs]]
 
-> The issue about not getting all the waipoints until you rebuild has been solved, the current plugin had issues with keeping track of updated and deleted waypoints which is now fixed in my branch. --[[Tincho]]
+> The issue about not getting all the waipoints until you rebuild has been solved, the current plugin had issues with keeping track of updated and deleted waypoints which is now fixed in my branch. --[[users/Tincho]]

update on plugin progress
diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
index b6b5c7a13..05c2294c3 100644
--- a/doc/plugins/osm/discussion.mdwn
+++ b/doc/plugins/osm/discussion.mdwn
@@ -45,9 +45,11 @@ For usability it would be great if it was possible to display the active waypoin
 
 - Maps actually work again
 - Maps work when embedded in HTTPS sites
-- Multiple maps and multiple waypoints in a page probably work better now
+- Multiple maps and multiple waypoints in a page work properly
 - Maps _do_ appear in inlines
 - Pagestate hash gets cleaned up better after edit/preview/delete
+- Unigue icon for "active waypoint" works, also possible to select manually any waypoint to highlight
+- Good test coverage, including inlines and multiple maps/waypoints per page
 
 ### Wishlist
 
@@ -62,7 +64,7 @@ For usability it would be great if it was possible to display the active waypoin
 - Given this is backward-incompatible, dhould we call it something other than "osm"?
 - What needs scrubbing? Have we covered all the bases? Too many bases?
 - Should we vendor Leaflet into an underlay, instead of needing a URL to load it from a CDN? [[schmonz]] somewhat prefers this, so we avoid needing external resources by default, avoid breaking when the Leaflet CDN is down, etc.
-- Should we write some tests before merging? `osm.pm` hadn't had any, FWIW
+- Should we write some tests before merging? `osm.pm` hadn't had any, FWIW -- [[Tincho]] Done
 
 Bump! Tincho would like to see us merge his effort, and FWIW I'd also
 rather not have to carry around a local copy of his work to get a map
@@ -80,3 +82,5 @@ Looks like good changes to me!
 > did a grep `Placemark pois.kml|wc -l` which returned 3468. Which perhaps isn't that much? I'm thinking about how individual poi files might affect performance. My performance troubles are more likely to be with my tweaked album and img plugins though.
 
 --[[kjs]]
+
+> The issue about not getting all the waipoints until you rebuild has been solved, the current plugin had issues with keeping track of updated and deleted waypoints which is now fixed in my branch. --[[Tincho]]

personal page
diff --git a/doc/plugins/osm/Tincho.mdwn b/doc/plugins/osm/Tincho.mdwn
new file mode 100644
index 000000000..25ee1a1cc
--- /dev/null
+++ b/doc/plugins/osm/Tincho.mdwn
@@ -0,0 +1,3 @@
+[Martín Ferrari](https://blog.tincho.org/)
+
+Long time user of ikiwiki. Made a [rewrite](https://blog.tincho.org/posts/OSM_in_IkiWiki/) of the OSM plugin, still pending merge.

diff --git a/doc/bugs/pandoc_plugin_disables_recentchanges.mdwn b/doc/bugs/pandoc_plugin_disables_recentchanges.mdwn
index 83272868e..b051b3d98 100644
--- a/doc/bugs/pandoc_plugin_disables_recentchanges.mdwn
+++ b/doc/bugs/pandoc_plugin_disables_recentchanges.mdwn
@@ -6,3 +6,7 @@ Steps to reproduce:
 - run `ikiwiki --setup mywiki.setup` again
 
 Then the recentchanges page doesn't work anymore.
+
+Pandoc version: 1.19.2.1
+Ikwiki version: 3.20170622
+

diff --git a/doc/bugs/pandoc_plugin_disables_recentchanges.mdwn b/doc/bugs/pandoc_plugin_disables_recentchanges.mdwn
new file mode 100644
index 000000000..83272868e
--- /dev/null
+++ b/doc/bugs/pandoc_plugin_disables_recentchanges.mdwn
@@ -0,0 +1,8 @@
+Steps to reproduce: 
+
+- Create a new wiki via ikiwiki --setup /etc/ikiwiki/auto.setup
+- Test your wiki and the recentchanges page
+- add the pandoc plugin to the setup file and set correct path to executable (e.g. `/usr/bin/pandoc`)
+- run `ikiwiki --setup mywiki.setup` again
+
+Then the recentchanges page doesn't work anymore.

Added a comment
diff --git a/doc/forum/Error:_cannot_write_to___47__home__47__user__47__myiki2__47__.ikiwiki__47__lockfile:_Permission_denied_/comment_3_55cff56ac59bd9607458710ab36a63c8._comment b/doc/forum/Error:_cannot_write_to___47__home__47__user__47__myiki2__47__.ikiwiki__47__lockfile:_Permission_denied_/comment_3_55cff56ac59bd9607458710ab36a63c8._comment
new file mode 100644
index 000000000..491bc172c
--- /dev/null
+++ b/doc/forum/Error:_cannot_write_to___47__home__47__user__47__myiki2__47__.ikiwiki__47__lockfile:_Permission_denied_/comment_3_55cff56ac59bd9607458710ab36a63c8._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="vignan.lavu@9d85b92080da180cb07dd13c86bfacd378bc0659"
+ nickname="vignan.lavu"
+ avatar="http://cdn.libravatar.org/avatar/e31721e40951baf54f357f6eeeb19d1e"
+ subject="comment 3"
+ date="2018-08-13T12:34:26Z"
+ content="""
+I faced similar issue when i restored my blogs into new wiki. In my case it is due to permission of ikiwiki.cgi file (/var/www/<blog>/ikiwiki.cgi).
+It should be 6775 rather than 775.
+
+Hope this helps.
+"""]]

not going away, yet ...
diff --git a/doc/todo/libravatar_EOL.mdwn b/doc/todo/libravatar_EOL.mdwn
index 96d7502a6..395e5fadd 100644
--- a/doc/todo/libravatar_EOL.mdwn
+++ b/doc/todo/libravatar_EOL.mdwn
@@ -9,3 +9,9 @@ problem. (The shutdown page doesn't say what will happen to the DNS.)
 
 It might also be a good idea to filter out avatar urls in existing comments
 that point to libravatar.org. --[[Joey]]
+
+---
+
+Thankfully there is hope again: <https://blog.libravatar.org/posts/Libravatar.org_is_not_going_away/>
+
+A group of people formed to continue running and developing the project. Thus it would be great, if ikiwiki would continue to support it. Thank you! -- sumpfralle

Added a comment: Re: How to understand the process of installation
diff --git a/doc/forum/How_to_install_Text:Multimarkdown__63__/comment_2_5192a5348ee10fc35349cac1b1e6f61f._comment b/doc/forum/How_to_install_Text:Multimarkdown__63__/comment_2_5192a5348ee10fc35349cac1b1e6f61f._comment
new file mode 100644
index 000000000..c0fee9c30
--- /dev/null
+++ b/doc/forum/How_to_install_Text:Multimarkdown__63__/comment_2_5192a5348ee10fc35349cac1b1e6f61f._comment
@@ -0,0 +1,8 @@
+[[!comment format=html
+ username="luciferwhite"
+ avatar="http://cdn.libravatar.org/avatar/f29fd1395f5b340e1d257a0923467c53"
+ subject="Re: How to understand the process of installation"
+ date="2018-07-27T17:13:04Z"
+ content="""
+You have to great to know the proper way of installing the part which will be more productive for the developer to find out the exact part which is going to take the best way to somehow need the perfect guide <a href=\"https://supportprop58.com/windows-10-audio-crackling/\">windows 10 sound crackling</a> that will show you the perfect process to install the multilayer .
+"""]]

Start thread on "track changes" visualization of ikiwiki page edits
diff --git a/doc/forum/Office-like___34__track_changes__34___visualization_for_page_edits.mdwn b/doc/forum/Office-like___34__track_changes__34___visualization_for_page_edits.mdwn
new file mode 100644
index 000000000..75dc8a964
--- /dev/null
+++ b/doc/forum/Office-like___34__track_changes__34___visualization_for_page_edits.mdwn
@@ -0,0 +1,16 @@
+I have been using ikiwiki as a collaborative notetaking tool for about seven years and really like it.
+
+I would like to start experimenting with ikiwiki as an alternative to Google Docs and Libre/Open/MS Office for collaborating on scientific papers.
+A feature that would make this experiment more palatable for some of my collaborators is if the revision history for a wiki page could be visualized as in the "track changes" mode in Office, where changes from each editor are highlighted in different colors, old text is struck out and visible adjacent to the new text (similar to wdiff), and mousing over highlighted or struck-out text indicates the revision that introduced that text (i.e., the sort of information generated by git-blame).  There is a similar feature in Google Docs, but (I think) limited to commits within a given time window.
+
+I expect to have time to work on this in early 2019.
+
+I would like to ask the ikiwiki community:
+
+1. Does such an ikiwiki feature already exist, or is anyone working on one (the closest I can find is the [[editdiff plugin|plugins/editdiff/]])?
+
+2. Is this feature best implemented as a plugin or something else?  Are there useful examples or bits of the ikiwiki source to take a look at?
+
+Thank you for your time,
+
+Mark

diff --git a/doc/forum/How_to_make_inline_and_po_work_together__63__.mdwn b/doc/forum/How_to_make_inline_and_po_work_together__63__.mdwn
index 1b5dac760..8b259183b 100644
--- a/doc/forum/How_to_make_inline_and_po_work_together__63__.mdwn
+++ b/doc/forum/How_to_make_inline_and_po_work_together__63__.mdwn
@@ -8,7 +8,7 @@ sidebar.mdwn
 
 p001.mdwn
 
-p002.mdwn[[!inline pages="2019* and tagged(ru)" limit=1 actions=no]]
+p002.mdwn
 
 p003.mdwn
 

diff --git a/doc/forum/How_to_make_inline_and_po_work_together__63__.mdwn b/doc/forum/How_to_make_inline_and_po_work_together__63__.mdwn
new file mode 100644
index 000000000..1b5dac760
--- /dev/null
+++ b/doc/forum/How_to_make_inline_and_po_work_together__63__.mdwn
@@ -0,0 +1,19 @@
+I want to setup a kind of a blog with the help of ikiwiki, which will contain pages in several languages. First I set it up and added some content. Index page contains an inline directive to show just the most recent "post", and it works flawlessly. Then I've enabled po plugin and rebuilt my blog. Unfortunately, I cannot get inline work properly, because it either captures some po/pot file, or not capture any file for a translation. So, how to make inline and po work together?
+
+Say, I have a following structure:
+
+index.mdwn
+
+sidebar.mdwn
+
+p001.mdwn
+
+p002.mdwn[[!inline pages="2019* and tagged(ru)" limit=1 actions=no]]
+
+p003.mdwn
+
+with the corresponding po/pot files. My index.mdwn contain only inline (besides a standard sidebar) to capture the latest (p003.mdwn) file:
+
+\[[!inline pages="p*" limit=1 actions=no]]
+
+I've tried to use many different pagespecs, different pages options (like page, glob and so on), even adding tags and trying to exclude pages without relevant tags (and po files contained different tags). But I'm lost completely. Sometime it worked for the master language, but didn't for translations; sometimes it showed only one translation for all languages.

Reviewed patch.
diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
index 591c0b231..037b5925d 100644
--- a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -85,3 +85,5 @@
     2.18.0
     
 [[!tag patch]]
+
+> Thank you Chris! I've reviewed the patch (with my "original author of the po plugin" hat on) and it looks good to me. I'm not 100% sure about `alreadyfiltered` being the best name for something that's not a predicated anymore but it's good enough. Then I wore my end-user hat and confirmed that with Chris' patch applied, the reproducer we had for this bug at Tails works fine. So IMO we're good to go and I recommend to apply this patch. Thanks in advance! -- [[intrigeri]]

bug report
diff --git a/doc/bugs/git_test_receive_wrapper_fails.mdwn b/doc/bugs/git_test_receive_wrapper_fails.mdwn
new file mode 100644
index 000000000..fcac46c5f
--- /dev/null
+++ b/doc/bugs/git_test_receive_wrapper_fails.mdwn
@@ -0,0 +1,33 @@
+Getting this when a git push to git:// runs the pre-receive hook
+which is set up by the `git_test_receive_wrapper`:
+
+	remote: fatal: Not a git repository (or any of the parent directories): .git
+	remote: 'git log --pretty=raw --raw --abbrev=40 --always -c -r 21161ba01a093534ef97188eae098d83554dbcc6..73820a1d7e76318d8b1ac23e1c6d47e50a3e8ca2 --no-renames -- .' failed: 
+	To git://git-annex.branchable.com/
+	 ! [remote rejected]     master -> master (pre-receive hook declined)
+	error: failed to push some refs to 'git://git-annex.branchable.com/'
+
+Relevant code:
+
+                # Avoid chdir when running git here, because the changes
+                # are in the master git repo, not the srcdir repo.
+                # (Also, if a subdir is involved, we don't want to chdir to
+                # it and only see changes in it.)
+                # The pre-receive hook already puts us in the right place.
+                push @rets, git_parse_changes('.', 0, git_commit_info('.', $oldrev."..".$newrev));
+
+This is with  git 1:2.11.0-3+deb9u2 on debian stable, ikiwiki 3.20171002.
+
+Tossing a call to pwd in there, it's at the top of the master (bare) git
+repository, which seems right. I can do a similar git log at that location
+manually (using different revs). Looking at the environment at that point
+(in another wiki that has the same problem), I found only these
+git env vars:
+
+	remote: GIT_ALTERNATE_OBJECT_DIRECTORIES=/home/b-joeyh/source.git/./objects
+	remote: GIT_OBJECT_DIRECTORY=/home/b-joeyh/source.git/./objects/incoming-hVfXvD
+	remote: GIT_QUARANTINE_PATH=/home/b-joeyh/source.git/./objects/incoming-hVfXvD
+
+[[!commit 6fb43c29f63b85c3424520819427903e5a204426]] is relevant to that,
+and I guess it didn't fully solve the problem.
+--[[Joey]]

Bump Tincho's OSM for needing review.
diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
index 2a41b35d2..b6b5c7a13 100644
--- a/doc/plugins/osm/discussion.mdwn
+++ b/doc/plugins/osm/discussion.mdwn
@@ -64,6 +64,11 @@ For usability it would be great if it was possible to display the active waypoin
 - Should we vendor Leaflet into an underlay, instead of needing a URL to load it from a CDN? [[schmonz]] somewhat prefers this, so we avoid needing external resources by default, avoid breaking when the Leaflet CDN is down, etc.
 - Should we write some tests before merging? `osm.pm` hadn't had any, FWIW
 
+Bump! Tincho would like to see us merge his effort, and FWIW I'd also
+rather not have to carry around a local copy of his work to get a map
+with waypoints on my HTTPS site. [[smcv]], can you spare some round
+tuits to give us your thoughts? --[[schmonz]]
+
 ----
 
 Just stumbled onto this. 

add patch tag
diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
index 1830e9f50..591c0b231 100644
--- a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -84,3 +84,4 @@
     -- 
     2.18.0
     
+[[!tag patch]]

diff --git a/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
new file mode 100644
index 000000000..1830e9f50
--- /dev/null
+++ b/doc/todo/Re-use_translated_content_instead_of_skipping_if_previously_translated.mdwn
@@ -0,0 +1,86 @@
+    From: Chris Lamb <lamby@debian.org>
+    Date: Thu, 28 Jun 2018 19:30:15 +0100
+    Subject: [PATCH] Re-use translated content instead of skipping if previously
+     translated.
+    
+    This fixes an issue where an initial `inline` directive would be translated
+    correctly, but subsequent inlines of the same would result in the raw
+    contents of the `.po` file being inserted into the page instead.
+    
+    For example, given a `index.mdwn` containing:
+    
+        \[[!inline pages="inline" raw="yes"]]
+        \[[!inline pages="inline" raw="yes"]]
+    
+    .. and an `index.de.po` of:
+    
+        msgid "\[[!inline pages=\"inline\" raw=\"yes\"]]\n"
+        msgstr "\[[!inline pages=\"inline.de\" raw=\"yes\"]]\n"
+    
+    .. together with an `inline.mdwn` of:
+    
+       This is inlined content.
+    
+    .. and an `inline.de.po` of:
+    
+        msgid "This is inlined content."
+        msgstr "This is German inlined content."
+    
+    .. would result in the following translation:
+    
+        This is the inlined content.
+        # SOME DESCRIPTIVE TITLE
+        # Copyright (C) YEAR Free Software Foundation, Inc.
+        # This file is distributed under the same license as the PACKAGE package.
+        # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+    
+    .. instead of, of course:
+    
+        This is the inlined content.
+        This is the inlined content.
+    ---
+     IkiWiki/Plugin/po.pm | 15 +++++++++------
+     1 file changed, 9 insertions(+), 6 deletions(-)
+    
+    diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
+    index 418e8e58a..ecd1f5499 100644
+    --- a/IkiWiki/Plugin/po.pm
+    +++ b/IkiWiki/Plugin/po.pm
+    @@ -303,9 +303,12 @@ sub filter (@) {
+     	my $page = $params{page};
+     	my $destpage = $params{destpage};
+     	my $content = $params{content};
+    -	if (istranslation($page) && ! alreadyfiltered($page, $destpage)) {
+    -		$content = po_to_markup($page, $content);
+    -		setalreadyfiltered($page, $destpage);
+    +	if (istranslation($page)) {
+    +		if (!defined(alreadyfiltered($page, $destpage))) {
+    +			$content = po_to_markup($page, $content);
+    +			setalreadyfiltered($page, $destpage, $content);
+    +		}
+    +		$content = alreadyfiltered($page, $destpage);
+     	}
+     	return $content;
+     }
+    @@ -747,15 +750,15 @@ sub myisselflink ($$) {
+     		my $page=shift;
+     		my $destpage=shift;
+     
+    -		return exists $filtered{$page}{$destpage}
+    -			 && $filtered{$page}{$destpage} eq 1;
+    +		return $filtered{$page}{$destpage};
+     	}
+     
+     	sub setalreadyfiltered($$) {
+     		my $page=shift;
+     		my $destpage=shift;
+    +		my $content=shift;
+     
+    -		$filtered{$page}{$destpage}=1;
+    +		$filtered{$page}{$destpage}=$content;
+     	}
+     
+     	sub unsetalreadyfiltered($$) {
+    -- 
+    2.18.0
+    

add a way to fix tables for bootstrap themes
diff --git a/doc/plugins/contrib/bootstrap.mdwn b/doc/plugins/contrib/bootstrap.mdwn
new file mode 100644
index 000000000..9ed0af593
--- /dev/null
+++ b/doc/plugins/contrib/bootstrap.mdwn
@@ -0,0 +1,65 @@
+[[!meta author="anarcat"]]
+[[!template id=plugin name=bootstrap author="[[anarcat]]"]]
+[[!tag type/chrome]]
+[[!template  id=gitbranch branch=anarcat/bootstrap author="[[anarcat]]"]]
+
+## Rationale
+
+One of the most annoying features of bootstrap and/or the (informal)
+[[bootstrap theme|todo/merge_bootstrap_branch/]] is the lack of styling on tables. It makes
+tables look horrible! Look, for example, as the table in [this
+page](https://web.archive.org/web/20180513200625/https://anarc.at/blog/2018-04-12-terminal-emulators-1/): margins are tiny so everything is jumbled up together, and
+there are very little visual markers to differenciate between cells. I
+don't have a better example handy, but this is particularly bad when a
+cell ends up having long lines of text that are wrapped with multiple
+lines.
+
+Bootstrap has a nice [table](https://getbootstrap.com/docs/4.0/content/tables/) style that is not automatically
+applied to all tables, probably to avoid breaking table-based layout
+and other custom controls like calendars a random site might spew
+out. Unfortunately, the various Ikiwiki output plugins (most notably
+the [[plugins/mdwn]] plugin) do not add that class to generated
+tables.
+
+## Solution
+
+I found there are two ways of fixing that. One is to use raw HTML: the
+[[plugins/htmlscrubber]] plugin will let through `class` elements in
+tables so this will actually work:
+
+    <table class="table"><tr><td>This<td>is<tr>a<tr>table!</table>
+
+But of course, it would be nice if Markdown-formatted tables would
+actually render correctly as well. For this, I have written a [simple
+plugin](https://gitlab.com/anarcat/ikiwiki/blob/bootstrap/IkiWiki/Plugin/bootstrap.pm) that adds that class to empty table tags. It's very dumb, but
+it should generally work, or at least it works for my case. It will
+not touch any `<table>` tag that already has other class elements, so
+it should be safe to use alongside other plugins that generate their
+own `<table>` markup, provided they *do* add some sort of `class`,
+`id` or other attribute. Unfortunately, the [[plugins/contrib/bibtex]]
+plugin does not do that correctly and somewhat looks ugly with this
+plugin. Compare for example, [this old version](https://web.archive.org/web/20170717065911/https://anarc.at/communication/) with [the new
+rendering](https://web.archive.org/web/20180626203321/https://anarc.at/communication/). I'm still unsure which one looks better, actually...
+
+## Discussion
+
+Anyways, I wasn't quite sure where to put this, but it seems like an
+important improvement to make if we're going to 
+[[todo/merge_bootstrap_branch]]. I am not sure of the implementation
+at all: the best way I found to edit only the rendered content (and
+not the whole HTML page with the template) is to use the `sanitize`
+hook, but I'm not sure it's the right way to go. It certainly seems
+backwards to introduce new markup in a "sanitization"
+procedure. Furthermore, I first tried to change *all* `<table>` tags
+even if they had extra attributes, but I found I didn't want to add
+`class` attributes to elements that already had some, soand that ended
+up making the regex work way too messy, so I stuck to the simpler
+way.
+
+Furthermore, there might be other markup elements we want to improve
+upon. This only fixes tables, but maybe other elements would benefit
+from additionnal styling. The [content](https://getbootstrap.com/docs/4.0/content/reboot/) section of the bootstrap
+docs says there are special classes for tags like `img`, `form`,
+`input` and `div` that might be interesting to look at... 
+
+-- [[anarcat]]

diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn
index dc0aebf2d..5a2a10987 100644
--- a/doc/sandbox.mdwn
+++ b/doc/sandbox.mdwn
@@ -229,22 +229,22 @@ I must **emphasise** this.
 
 
 // more pointers
-#include <iostream>
-using namespace std;
-
-int main ()
-{
-  int firstvalue = 5, secondvalue = 15;
-  int * p1, * p2;
-
-  p1 = &firstvalue;  // p1 = address of firstvalue
-  p2 = &secondvalue; // p2 = address of secondvalue
-  *p1 = 10;          // value pointed to by p1 = 10
-  *p2 = *p1;         // value pointed to by p2 = value pointed to by p1
-  p1 = p2;           // p1 = p2 (value of pointer is copied)
-  *p1 = 20;          // value pointed to by p1 = 20
-  
-  cout << "firstvalue is " << firstvalue << '\n';
-  cout << "secondvalue is " << secondvalue << '\n';
-  return 0;
-}
+    #include <iostream>
+    using namespace std;
+    
+    int main ()
+    {
+      int firstvalue = 5, secondvalue = 15;
+      int * p1, * p2;
+    
+      p1 = &firstvalue;  // p1 = address of firstvalue
+      p2 = &secondvalue; // p2 = address of secondvalue
+      *p1 = 10;          // value pointed to by p1 = 10
+      *p2 = *p1;         // value pointed to by p2 = value pointed to by p1
+      p1 = p2;           // p1 = p2 (value of pointer is copied)
+      *p1 = 20;          // value pointed to by p1 = 20
+      
+      cout << "firstvalue is " << firstvalue << '\n';
+      cout << "secondvalue is " << secondvalue << '\n';
+      return 0;
+    }

proposed patch would break the ability to have links in lists and other non-code-block indented content
diff --git a/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn b/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn
index eca054e61..daf5d9e99 100644
--- a/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn
+++ b/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn
@@ -33,3 +33,24 @@
 Related to [[bugs/wiki links still processed inside code blocks]] and [[forum/How_to_format___91____91__foobar__93____93___in_code_blocks__63__]].
 
 [[!tag patch]]
+
+> It looks as though this patch would break linkification in any syntactic construct that
+> uses indentation but isn't a code block, for instance a list:
+>
+>     * This is a list
+>         * So is this
+>             * And \[[this is a link|http://example.com]]
+>
+> rendered as:
+>
+> * This is a list
+>     * So is this
+>         * And [[this is a link|http://example.com]]
+>
+> It's also assuming that Markdown is the only language available (trying to use Markdown
+> rules), and even in Markdown it doesn't support Github-style fenced code blocks if enabled.
+>
+> This is not something that can be done correctly by just patching the link plugin.
+> I'm not sure whether it's something that can be done correctly at all, unfortunately.
+>
+> [[!tag reviewed]] --[[smcv]] 

Don't use --noprefix for the patch
diff --git a/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn b/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn
index 3dc4215ad..eca054e61 100644
--- a/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn
+++ b/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn
@@ -1,12 +1,12 @@
-    diff --git IkiWiki/Plugin/link.pm IkiWiki/Plugin/link.pm
-    index 1ba28eafd..27427b183 100644
-    --- IkiWiki/Plugin/link.pm
-    +++ IkiWiki/Plugin/link.pm
+    diff --git a/IkiWiki/Plugin/link.pm b/IkiWiki/Plugin/link.pm
+    index 1ba28eafd..61a397bf8 100644
+    --- a/IkiWiki/Plugin/link.pm
+    +++ b/IkiWiki/Plugin/link.pm
     @@ -107,7 +107,13 @@ sub linkify (@) {
         my $page=$params{page};
         my $destpage=$params{destpage};
      
-    -   $params{content} =~ s{(\\?)$link_regexp}{
+    -	$params{content} =~ s{(\\?)$link_regexp}{
     +    my $content;
     +    for my $line ( split /\n/, $params{content} ) {
     +        if ( $line =~ /^(?:\t|    )/ ) {
@@ -20,12 +20,12 @@
     @@ -122,8 +128,10 @@ sub linkify (@) {
                              : htmllink($page, $destpage, linkpage($3),
                                  anchor => $4))
-             }eg;
+                 }eg;
     +        $content .= $line . "\n";
     +    }
      
-    -   return $params{content};
-    +    return $content;
+    -	return $params{content};
+    +	return $content;
      }
      
      sub scan (@) {

diff --git a/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn b/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn
index a022b5552..3dc4215ad 100644
--- a/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn
+++ b/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn
@@ -31,3 +31,5 @@
      sub scan (@) {
 
 Related to [[bugs/wiki links still processed inside code blocks]] and [[forum/How_to_format___91____91__foobar__93____93___in_code_blocks__63__]].
+
+[[!tag patch]]

Skip link parsing if a code block identifier is found
diff --git a/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn b/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn
new file mode 100644
index 000000000..a022b5552
--- /dev/null
+++ b/doc/todo/Don__39__t_change_text_like___91____91__this__93____93___in_code_blocks.mdwn
@@ -0,0 +1,33 @@
+    diff --git IkiWiki/Plugin/link.pm IkiWiki/Plugin/link.pm
+    index 1ba28eafd..27427b183 100644
+    --- IkiWiki/Plugin/link.pm
+    +++ IkiWiki/Plugin/link.pm
+    @@ -107,7 +107,13 @@ sub linkify (@) {
+        my $page=$params{page};
+        my $destpage=$params{destpage};
+     
+    -   $params{content} =~ s{(\\?)$link_regexp}{
+    +    my $content;
+    +    for my $line ( split /\n/, $params{content} ) {
+    +        if ( $line =~ /^(?:\t|    )/ ) {
+    +            $content .= $line . "\n";
+    +            next;
+    +        }
+    +        $line =~ s{(\\?)$link_regexp}{
+                 defined $2
+                     ? ( $1
+                         ? "[[$2|$3".(defined $4 ? "#$4" : "")."]]"
+    @@ -122,8 +128,10 @@ sub linkify (@) {
+                             : htmllink($page, $destpage, linkpage($3),
+                                 anchor => $4))
+             }eg;
+    +        $content .= $line . "\n";
+    +    }
+     
+    -   return $params{content};
+    +    return $content;
+     }
+     
+     sub scan (@) {
+
+Related to [[bugs/wiki links still processed inside code blocks]] and [[forum/How_to_format___91____91__foobar__93____93___in_code_blocks__63__]].

a frustrating limitation for me
diff --git a/doc/plugins/img/discussion.mdwn b/doc/plugins/img/discussion.mdwn
index bc525a562..048ad15b9 100644
--- a/doc/plugins/img/discussion.mdwn
+++ b/doc/plugins/img/discussion.mdwn
@@ -36,3 +36,12 @@ Is it possible to give an external image URL, must the image be local? One use c
 >>> me less than one hour to write and publish; I will delete it soon.
 >>>
 >>> Anyway, thanks for your answer. --[[Louis|spalax]]
+
+>>>> Considering how limited Markdown is, I frequently struggle with
+>>>> this `img` limitation as well. My last fight was adding a caption
+>>>> to an image. Sure, this can be done by hand, but I stumbled upon
+>>>> Ikiwiki's lack of CSS support for `figcaption`. And it's kind of
+>>>> annoying to have to write all that `<figure>` stuff by hand when
+>>>> there's a `caption` parameter to the `img` tag... It would sure
+>>>> be useful to be able to reference external URLs, even if it means
+>>>> thumbnails are turned off... --[[anarcat]]

improvements to img captions
diff --git a/doc/todo/html5_image_captions.mdwn b/doc/todo/html5_image_captions.mdwn
new file mode 100644
index 000000000..3a5505d8b
--- /dev/null
+++ b/doc/todo/html5_image_captions.mdwn
@@ -0,0 +1,78 @@
+Currently, the [[ikiwiki/directive/img]] directive creates a `<img>`
+tag for images (which is fine) but also creates a traditional
+`<table>` structure around it to show the caption when the `caption`
+parameter is passed. This is less fine.
+
+HTML5 introduced the `<figure>` element, and particularly the
+[figcaption](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figcaption) element, which is particularly relevant here. It is
+not filtered by the html scrubber (or so it seems), so it's currently
+possible to use it in Markdown documents already, like so:
+
+    <figure>
+    <img src="example.jpg" />
+    <figcaption>Foo</figcaption>
+    </figure>
+
+This is standard and works well, except there are bits of style
+missing, because Ikiwiki's stylesheet assumes its peculiar table image
+layout. `doc/style.css`, for example, has this:
+
+    .img caption {
+            font-size: 80%;
+            caption-side: bottom;
+            text-align: center;
+    }
+
+... which is a good start to format tables, but is ineffective for
+`figcaption`. In my tests, I have used this to good effect:
+
+    .img caption, figcaption {
+        text-align: center;
+        /* assuming that relative size is more responsive than arbitrary percentages */
+        font-size: smaller;
+        caption-side: bottom;
+    }
+
+The `figcaption` stylesheet reuses the `<table>` semantics so the
+above just works, as far as I can tell.
+
+The final step would be to unmangle the `<img>` directive output. It
+should output the above `<figure>` snippet if HTML5 is enabled in the
+wiki.
+
+Otherwise we might also want to get rid of the `<table>` stuff
+anyways, as most examples out there use a `<div>` in HTML4. Here is an
+[example from the W3C](https://www.w3.org/Style/Examples/007/figures.en.html#Illustrati) or [bootstrap](https://getbootstrap.com/docs/3.3/components/#thumbnails-custom-content). The former suggests
+something like this:
+
+    <div class="figure">
+      <p><img src="example.jpg" />
+      <p>Foo
+    </div>
+
+The CSS, in that case, would be simply:
+
+    div.figure {
+      text-align: center;
+      font-size: smaller;
+    }
+
+The double-`<p>` is what allows pushing the caption upwards with CSS
+in their later example, with this CSS:
+
+    div.figure {
+      display: table;
+    }
+    div.figure p + p {
+      display: table-caption;
+      caption-side: top;
+    }
+
+The `<div>` mechanism seems much simpler than the current table-based
+markup. I'd be happy to provide patches to do the above if there's
+interest. Considering that most of my images are hosted outside of
+ikiwiki, I cannot use of the `img` directive in the first place so I
+don't need to patch `img.pm` and don't want to carry yet another
+delta... But I could sure use upstreaming the CSS fixes. ;)
+
+Thanks! -- [[anarcat]]

Creating my Page
diff --git a/doc/users/ankit.mdwn b/doc/users/ankit.mdwn
new file mode 100644
index 000000000..75592904c
--- /dev/null
+++ b/doc/users/ankit.mdwn
@@ -0,0 +1,6 @@
+[[!meta title="Ankit"]]
+
+Hello World!
+
+I use Ikiwiki as my database for storing various information. I wrote and maintain a [Docker Image](https://hub.docker.com/r/ankitrgadiya/ikiwiki),
+source of which is on [Github](https://github.com/ankitrgadiya/docker-ikiwiki/)

popup: Hide template content from rendered documentation
Bug: https://bugs.debian.org/898836
diff --git a/doc/templates/popup.mdwn b/doc/templates/popup.mdwn
index b721a95f9..f552bb59a 100644
--- a/doc/templates/popup.mdwn
+++ b/doc/templates/popup.mdwn
@@ -10,7 +10,7 @@ large for good usability.
 Note that browsers that do not support the CSS will display the popup
 inline in the page, inside square brackets.
 
-[[templatebody <<ENDBODY
+[[!templatebody <<ENDBODY
 <span class="popup"><TMPL_VAR mouseover>
 <span class="paren">[</span><span class="balloon"><TMPL_VAR popup></span><span class="paren">]</span>
 </span>

bug report for error when python-future is installed
diff --git a/doc/bugs/installing_python-future_causes_non-fatal_error.mdwn b/doc/bugs/installing_python-future_causes_non-fatal_error.mdwn
new file mode 100644
index 000000000..d9b0dcbf9
--- /dev/null
+++ b/doc/bugs/installing_python-future_causes_non-fatal_error.mdwn
@@ -0,0 +1,18 @@
+On Trisquel 8.0, if you have the `python-future` package installed, this causes the wrong module to get loaded by python2.7.
+
+In `/usr/lib/ikiwiki/plugins/proxy.py`:
+
+
+    try:  # Python 3
+        import xmlrpc.server as _xmlrpc_server
+    except ImportError:  # Python 2
+        import SimpleXMLRPCServer as _xmlrpc_server
+
+`xmlrpc.server` gets loaded even though we are using python2.7. This causes the following non-fatal error when pushing to the git repo:
+
+    remote: Traceback (most recent call last):
+    remote:   File "/usr/lib/ikiwiki/plugins/rst", line 45, in <module>
+    remote:     from proxy import IkiWikiProcedureProxy
+    remote:   File "/usr/lib/ikiwiki/plugins/proxy.py", line 72, in <module>
+    remote:     class _IkiWikiExtPluginXMLRPCDispatcher(_xmlrpc_server.SimpleXMLRPCDispatcher):
+    remote: AttributeError: 'module' object has no attribute 'SimpleXMLRPCDispatcher'