Very nice solution Eric!

One question:



Best wishes
Mohammad


On Mon, Aug 2, 2021 at 6:02 AM Eric Shulman <[email protected]> wrote:

> On Sunday, August 1, 2021 at 9:48:12 AM UTC-7 Atronoush wrote:
>
>> I am sure this has been addressed before but I cannot find it in forum
>> Assume you have a complex filter that results in an output containing few
>> tiddlers. Then you want to show them with a delimiter e.g. pipe (|)
>> One solution is below. I am looking for a more efficient solution! I
>> assume here TW makes the search two times! I know we can use a $set widget
>> here, but what better solution do you propose?
>>
>
> Overall, an interesting challenge in TiddlyWiki filtering.
> I had fun trying several approaches...
>
> The most efficient one is to use $set, as you suggested, like this:
> <$set name="out" filter="[tag[HelloThere]] [tag[About]] [tag[Platforms]]">
> <$list filter="[enlist<out>butlast[]]"><$link/> | </$list>
> <$list filter="[enlist<out>last[]]   "><$link/>   </$list>
> </$set>
>

Is it possible to use *subfilter* instead of *enlist* here? Which is
recommended?

<$set name="out" filter="[tag[HelloThere]] [tag[About]] [tag[Platforms]]">
<$list filter="[subfilter<out>butlast[]]"><$link/> | </$list>
<$list filter="[subfilter<out>last[]]   "><$link/>   </$list>
</$set>




> The improvement is that the filter is only evaluated once, with two
> enlist[] operators added.  Depending upon how many matching tiddlers are
> found, and assuming a reasonably short list, the enlist[] operators are
> likely to be more efficient than evaluating the filter twice.  Also, note
> the use of -[last[]] in your initial post is incorrect... it doesn't
> actually remove the final item. The correct operator to use is butlast[],
> as shown above.
>
> I also tried this:
> <$set name=out filter="[tag[HelloThere]] [tag[About]] [tag[Platforms]]">
> <$vars last={{{ [enlist<out>last[]] }}}>
> <$list filter="[enlist<out>]"><$link/> <$text text={{{
> [<currentTiddler>!match<last>then[|]] }}}/> </$list>
> </$vars>
> </$set>
> The improvement here is the same as above, except that uses an extra
> variable ("last") and an inline filter to decide when to insert the "|"
> between items, so it's obviously a bit less efficient.
>
> Lastly, I tried this:
> <$vars lb="[[" rb="]]">
> <$set name=out filter="[tag[HelloThere]] [tag[About]] [tag[Platforms]]">
> <$wikify name="out" text="""<$list
> filter="[enlist<out>addprefix<lb>addsuffix<rb>join[ | ]trim[ | ]]"
> ><$link/></$list>""">
>    <<out>>
> </$wikify>
> </$set>
> </$vars>
> Of course, this is even less efficient than the previous solutions, as it
> uses wikify to produce the output, and needs to explicitly add brackets
> around the links.  However, it does demonstrate the use of join[] and
> trim[] to insert the "|" between items.
>
> -e
>
>> --
> You received this message because you are subscribed to the Google Groups
> "TiddlyWiki" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/tiddlywiki/b1fc22c4-d4e7-4f45-a26a-7f0757618dd2n%40googlegroups.com
> <https://groups.google.com/d/msgid/tiddlywiki/b1fc22c4-d4e7-4f45-a26a-7f0757618dd2n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"TiddlyWiki" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tiddlywiki/CAAV1gMAxudxUB%2BQ2vfv3K1hcacPumDrSj3KiFZ0HBgrBPMRtvQ%40mail.gmail.com.

Reply via email to