122 lines
5.6 KiB
Markdown
122 lines
5.6 KiB
Markdown
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/PreprocessorDirective]] 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/PreprocessorDirective]] 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 [[ikiwiki/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]]
|