--- /dev/null
+[[!template id=gitbranch branch=smcv/ready/map author="[[Simon McVittie|smcv]]"]]
+
+`\[[!map]]` can generate bad HTML with unbalanced open/close tags
+(in XML terms: "not well-formed") in certain situations. This
+appears to be a regression caused by fixing
+[[maps with nested directories sometimes make ugly lists]], which
+suppressed some redundant `</ul><ul>` pairs, but appears not to
+have the ideal logic for this, leading to malformed HTML.
+
+In particular, on a site with these pages:
+
+* alpha
+ * 1
+ * i
+ * ii
+ * iii
+ * iv
+ * 2
+ * a
+ * b
+ * 3
+* beta
+
+the maps "alpha/1 or beta", "alpha/1/i* or alpha/2/a or beta" and
+"alpha/1/i* or alpha/2/a" have malformed HTML.
+
+My `ready/map` branch adds a regression test and makes it pass.
+
+The fix is not particularly elegant - it generates the previous
+HTML with redundant `</ul><ul>` pairs, marks the redundant
+pairs, and edits them out afterwards - but it works. If anyone can come
+up with a cleaner algorithm that avoids generating the redundant tags
+in the first place, that would be even better. --[[smcv]]
>> Try this, then? I had to make some changes to `attachment`
>> to make the split versions available. I suggest reviewing
>> patch-by-patch.
->>
+
+>>> Branch updated; I'd missed a use of prune in ikiwiki.in itself.
+>>> Unfortunately, this means it does still need to support the
+>>> "undefined top directory" case: there isn't an obvious top
+>>> directory for wrappers. --[[smcv]]
+
>> I also tried to fix a related bug which I found while testing it:
>> the special case for renaming held attachments didn't seem to work.
>> (`smcv/wip/rename-held`.) Unfortunately, it seems that with that
--- /dev/null
+Hi,
+I am trying to build a template. The compilation of this template results in a weird exception. I have isolated the cause of the exception to the following point:
+
+If i have this in the template code:
+
+\[[!inline<br/>
+pages="\<TMPL_VAR SEL_PAGES\>"<br/>
+template=extract-entry<br/>
+\]]<br/>
+
+There is no problem at all. I can use the template with the desired result. But if I try to use this (just adding the "show" parameter):
+
+\[[!inline <br/>
+pages="\<TMPL_VAR SEL_PAGES>"<br/>
+template=extract-entry<br/>
+show=\<TMPL_VAR CNTPG><br/>
+\]]<br/>
+
+I get this exception on the Git bash console:
+
+<pre>
+$ git push
+Counting objects: 7, done.
+Delta compression using up to 8 threads.
+Compressing objects: 100% (4/4), done.
+Writing objects: 100% (4/4), 410 bytes, done.
+Total 4 (delta 3), reused 0 (delta 0)
+remote: From /home/b-odelama-com/source
+remote: eb1421e..5e1bac5 master -> origin/master
+remote: Argument "\x{3c}\x{54}..." isn't numeric in numeric lt (<) at /usr/share/perl5/IkiWiki/Plugin/inline.pm line 231.
+remote: Argument "\x{3c}\x{54}..." isn't numeric in numeric lt (<) at /usr/share/perl5/IkiWiki/Plugin/inline.pm line 231.
+To ssh://b-odelama-com@odelama-com.branchable.com/
+ eb1421e..5e1bac5 master -> master
+</pre>
+
+Please, let me know what to do to avoid this kind of error.
--- /dev/null
+[[!template id=plugin name=dynamiccookies author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/dynamiccookies author="[[schmonz]]"]]
+[[!tag type/web]]
+
+This plugin populates ikiwiki's cookiejar by calling an external
+program. The program is expected to print the serialized cookies
+on `stdout` in a form which can be `eval`'d (e.g., `Data::Dumper`).
+
+The plugin author's use case for this seemingly hacky interface:
+aggregating authenticated feeds at work, where for various reasons
+the needed cookies must be acquired using a separate `perl` from
+the one used by ikiwiki.
--- /dev/null
+[[!template id=plugin name=proxies author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/proxies author="[[schmonz]]"]]
+[[!tag type/format]]
+
+This plugin enables ikiwiki to open outbound connections (such as
+found in [[plugins/aggregate]], [[plugins/openid]], and [[plugins/pinger]])
+via a proxy. The proxy can be configurably avoided for connections
+to certain domains.
+
+### To do
+
+* Move duplicated user-agent setup out of other plugins into this one.
+* While I'm at it, fix [[bugs/http_proxy_for_openid]].
--- /dev/null
+[[!template id=plugin name=wc author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/wc author="[[schmonz]]"]]
+[[!tag type/meta]]
+[[!tag patch]]
+
+This plugin counts words in a page. For a single page, write a
+`\[[!wc]]` directive and the word count will be interpolated there.
+For a site, add `<TMPL_VAR WORDCOUNT>` to your [[templates]].
+
+If [[!cpan HTML::Strip]] is installed, the wordcount will be slightly
+more accurate.
+
+Possible enhancements:
+
+* Optimize: count words iff the result will be displayed. `sanitize()`
+ seems like the right place to count. Since it's called well after
+ `preprocess()`, I can tell whether a directive needs the result,
+ but since it appears to be called before `pagetemplate()`, I can't
+ tell whether a template wants to know and possibly skip the
+ computation. (In other words, if I add `$needed_for_template`
+ like `$needed_for_directive`, it gets set too late for `sanitize()`
+ to see.)
strictly required.
* `section` can optionally specify which section in the config file
the plugin fits in. The convention is to name the sections the
- same as the tags used for [[plugins|plugin]] on this wiki.
+ same as the tags used for [[plugins]] on this wiki.
### genwrapper
The `%wikistate` hash can be used by a plugin to store persistant state
that is not bound to any one page. To set a value, use
-`$wikistate{$id}{$key}=$value, where `$value` is anything Storable can
+`$wikistate{$id}{$key}=$value`, where `$value` is anything Storable can
serialize, `$key` is any string you like, and `$id` must be the same as the
"id" parameter passed to `hook()` when registering the plugin, so that the
state can be dropped if the plugin is no longer used.
(what [[schmonz]] will be migrating from).
* Enrich [feed metadata](http://cyber.law.harvard.edu/rss/rss.html)
by catching up `rsspage.tmpl` to `atompage.tmpl`.
+* Verify that [[plugins/more]] plays well with fancy podcasts.
+* Verify that the feeds validate.
* Subscribe to a fancy feed in some common podcatchers and verify
display details against a reference podcast.
-* Verify that the feeds validate.
+
+### Status
+
+[[!table data="""
+Feature |iTunes RSS|iTunes Atom|Downcast RSS|Downcast Atom
+Feed image | | | |
+Feed title |(./) |(./) |(./) |(./)
+Feed publisher | | | |
+Feed "category" | | | |
+Feed date |(./) |(./) |(./) |(./)
+Feed description | | | |
+Episode image | | | |
+Episode title |(./) |(./) |(./) |(./)
+Episode date |(./) |(./) |(./) |(./)
+Episode duration | | | |
+Episode author |(./) |(./) |(./) |(./)
+Episode description|(./) |(./) |(./) |
+Episode enclosure |(./) |(./) |(./) |(./)
+"""]]
### Must-have (for [[schmonz]], anyway)
* `itunes:keywords`
* Notable tags for entries:
* `itunes:duration`
- * use `Audio::TagLib` if present and applicable
- * fall back to `ffprobe`
+ * [[!cpan Audio::TagLib]] might be fastest, if present and applicable
+ * [ffprobe](http://ffmpeg.org/ffprobe.html) is reasonably fast
+ * [mediainfo](http://mediainfo.sourceforge.net/) is way slower
+ * Cache computed durations as pagestate
### Other ideas
-* Let the enclosure's MIME type be specified, in case someone ever
- needs to disagree with `File::MimeInfo`.
-* Extend [[plugins/inline]] to configurably generate additional
- subscription links (such as iTunes) alongside the RSS/Atom ones.
-* Verify that [[plugins/more]] plays well with fancy podcasts.
-* Allow enclosures that are outside the wiki.
+* Optionally specify the enclosure's:
+ * MIME type, in case `File::MimeInfo` guesses wrong.
+ * Duration, in case `ffprobe` guesses wrong.
+* Optionally specify enclosures outside the wiki:
+ * Some people don't want to store big unchanging files in the VCS.
+ * Other people like [podcasting found media](http://huffduffer.com/about).
+ * We'd have to download the file just to compute some metadata
+ about it, and then somehow not frequently re-download it.
+* Configurably generate additional subscription links (such as
+ iTunes) alongside the RSS/Atom ones in [[plugins/inline]].
* Support Apple's "enhanced podcasts" (if they're still relevant).
-
-### Status
-
-[[!table data="""
-Feature |iTunes RSS|iTunes Atom|Downcast RSS|Downcast Atom
-Feed image | | | |
-Feed title |(./) |(./) |(./) |(./)
-Feed publisher | | | |
-Feed "category" | | | |
-Feed date |(./) |(./) |(./) |(./)
-Feed description | | | |
-Episode image | | | |
-Episode title |(./) |(./) |(./) |(./)
-Episode date |(./) |(./) |(./) |(./)
-Episode duration | | | |
-Episode author |(./) |(./) |(./) |(./)
-Episode description|(./) |(./) |(./) |
-Episode enclosure |(./) |(./) |(./) |(./)
-"""]]