I'd like to see some way to conditionally include wiki text based on whether the wiki enables or disables certain features. For example, [[ikiwiki/formatting]], could use `\[[!if (enabled smiley) """Also, because this wiki has the smiley plugin enabled, you can insert \[[smileys]] and some other useful symbols."""]]`, and a standard template for [[plugins]] pages could check for the given plugin name to print "enabled" or "disabled". Some potentially useful conditionals: * `enabled pluginname` * `disabled pluginname` * `any pagespec`: true if any of the pages in the [[ikiwiki/PageSpec]] exist * `all pagespec`: true if all of the pages in the [[ikiwiki/PageSpec]] exist * `no pagespec` or `none pagespec`: true if none of the pages in the [[ikiwiki/PageSpec]] exist * `thispage pagespec`: true if pagespec includes the page getting rendered (possibly one including the page with this content on it). * `sourcepage pagespec`: true if pagespec includes the page corresponding to the file actually containing this content, rather than a page including it. * `included`: true if included on another page, via [[plugins/inline]], [[plugins/sidebar]], [[plugins/contrib/navbar]], etc. You may or may not want to include boolean operations (`and`, `or`, and `not`); if you do, you could replace `disabled` with `not enabled`, and `no pagespec` or `none pagespec` with `not any pagespec` (but you may want to keep the aliases for simplicity anyway). You also may or may not want to include an `else` clause; if so, you could label the text used if true as `then`. Syntax could vary greatly here, both for the [[ikiwiki/Directive]] and for the condition itself. > I think this is a good thing to consider, although conditionals tend to > make everything a lot more complicated, so I also want to KISS, and not > use too many of them. > > I'd probably implement this using the same method as pagespecs, so 'and', > 'or', '!', and paren groupings work. > > It could be thought of as simply testing to see if a pagespec matches > anything, using a slightly expanded syntax for the pagespec, which would > also allow testing for things like link(somepage), > created_before(somepage), etc. > > That also gives us your "any pagespec" for free: "page or page or page". > And for "all pagespec", you can do "page and page and page". > > For plugins testing, maybe just use "enabled(name)"? > > I'm not sure what the use cases are for thispage, sourcepage, and > included. I don't know if the included test is even doable. I'd be > inclined to not bother with these three unless there are use cases I'm > not seeing. > > As to the syntax, to fit it into standard preprocessor syntax, it would > need to look something like this: > > \[[!if test="enabled(smiley)" """foo"""]] > > --[[Joey]] >> [[ikiwiki/PageSpec]] syntax seems perfect, and your proposed syntax for the `if` >> [[ikiwiki/Directive]] looks fine to me. >> >> [[ikiwiki/PageSpec]]s don't give you `none` for free, since `!foo/*` as a boolean >> would mean "does any page not matching `foo/*` exist", not "does `foo/*` >> match nothing"; however, I don't really care much about `none`, since I >> just threw it in while brainstorming, and I don't know any compelling use >> cases for it. >> >> `enabled(pluginname)` will work perfectly, and `!enabled(pluginname)` >> makes `disabled` unnecessary. >> >> A few use cases for `included`, which I would really like to see: >> >> * On the sidebar page, you could say something like \[[!if test="!included" >> """This page, without this help message, appears as a sidebar on all >> pages."""]]. The help text would then only appear on the sidebar page >> itself, not the sidebar included on all pages. >> >> * On [[blog]] entries, you could use `included` to implement a cut. >> (Please don't take that as an argument against. :) ) For instance, you >> could use included rather than [[plugins/toggle]] for the detailed >> changelogs of ikiwiki, or to embed an image as a link in the feed rather >> than an embedded image. >> >> Some use cases for `thispage`: >> >> * You could use `thispage` to include or exclude parts of the sidebar based >> on the page you include it in. You can already use subpages/sidebar for >> subpages/*, but `thispage` seems more flexible, makes it trivial to have >> common portions rather than using [[plugins/inline]] with the `raw` >> option, and keeps the sidebar in one place. >> >> * You could use `thispage` to implement multiple different feeds for the >> same content with slightly different presentation. For instance, using >> templates for image inclusion, you could offer a feed with image links >> and a feed with embedded images. Similarly, using templates for cuts, you >> could offer a feed with cuts and a feed with full content in every post. >> >> I don't have any particular attachment to `sourcepage`. It only makes >> sense as part of a template, since otherwise you know the source page when >> typing in the if. >> >> --[[JoshTriplett]] This is now completely [[todo/done]]! See [[plugins/conditional]]. --[[Joey]] > You rock mightily. --[[JoshTriplett]] Is there a way to test features other than plugins? For example, to add to [[ikiwiki/Markdown]] something like \[[!if test="enabled(multimarkdown)" then="You can also use..."]] (I tried it like that just to see if it would work, but I wasn't that lucky.) --ChapmanFlack > No, not supported. I really think that trying to conditionalise text on a > page for multimarkdown is a path to madness or unreadability though. > Perhaps it would be better to have .mmdwn files that can only contain > multimarkdown? --[[Joey]] >> Really, there was only one (or maybe two) pages I had in mind as appropriate >> places for conditional text based on multimarkdown—the underlay pages >> for 'markdown' and maybe also 'formatting', because those are the pages you >> look at when you're trying to find out how to mark stuff up for the wiki, so >> if MM is enabled, they need to at least mention it and have a link to the >> MM syntax guide.--ChapmanFlack