Eric N

Thanks for sharing, I thought I would turn it into a macro because it is a 
general type of solution.

\define intersect(filter1 filter2)
<$set name="filterA" filter="$filter1$">
<$set name="filterB" filter="$filter2$">
<$set name="setAunionB" filter="[enlist<filterA>] [enlist<filterB>]">
<$set name="setAnotB" filter="[enlist<filterA>] -[enlist<filterB>]">
<$set name="setBnotA" filter="[enlist<filterB>] -[enlist<filterA>]">
<$set name="setAinterB" filter="[enlist<setAunionB>] -[enlist<setAnotB>] 
-[enlist<setBnotA>]">
<<list-links "[enlist<setAinterB>sort[]]">>
</$set></$set></$set></$set></$set>
\end

<<intersect "[tag[Todo]] [all[]prefix[a]]" "[tag[Howto]] [all[]prefix[al]]"
>>

But I avoid the list-links macro because its a fixed format
The following lists only tiddler titles, using the default list widget 
behaviour, but it easy to present things differentl
\define intersect(filter1 filter2)
<$set name="filterA" filter="$filter1$">
<$set name="filterB" filter="$filter2$">
<$set name="setAunionB" filter="[enlist<filterA>] [enlist<filterB>]">
<$set name="setAnotB" filter="[enlist<filterA>] -[enlist<filterB>]">
<$set name="setBnotA" filter="[enlist<filterB>] -[enlist<filterA>]">
<$set name="setAinterB" filter="[enlist<setAunionB>] -[enlist<setAnotB>] 
-[enlist<setBnotA>]">
<$list filter="[enlist<setAinterB>sort[]]">

</$list>
</$set></$set></$set></$set></$set>
\end

For example place this in the blank line above
  <$link/>, 

or you could add another parameter and use this template
\define intersect(filter1 filter2 template:"defaulttemplate")
<$set name="filterA" filter="$filter1$">
<$set name="filterB" filter="$filter2$">
<$set name="setAunionB" filter="[enlist<filterA>] [enlist<filterB>]">
<$set name="setAnotB" filter="[enlist<filterA>] -[enlist<filterB>]">
<$set name="setBnotA" filter="[enlist<filterB>] -[enlist<filterA>]">
<$set name="setAinterB" filter="[enlist<setAunionB>] -[enlist<setAnotB>] 
-[enlist<setBnotA>]">
<$list filter="[enlist<setAinterB>sort[]]" template="$template$">

</$list>
</$set></$set></$set></$set></$set>
\end

Enjoy the possibilities


Regards
Tony

On Wednesday, 6 May 2020 21:14:52 UTC+10, Eric N. wrote:
>
> I was stuck in my dev 
> <https://groups.google.com/forum/#!topic/tiddlywiki/H90XO43PblE> because 
> I couldn't output the intersection of two filters, each made of several 
> runs. I didn't find a built-in function to do so, and I couldn't find a 
> satisfying solution online. But I eventually found my own solution, shared 
> here.
>
> Say I want to get all the tiddlers that satisfy the following conditions 
> (toy example here, could also have a pair of very complex filters):
>
> (has tag Todo OR starts with "a") AND (has tag Howto OR starts with "al")
>
> This is computed by the following code, where the output list is enlist
> <setAinterB>, which is displayed by the list-links macro.
>
> <$set name="filterA" filter="[tag[Todo]] [all[]prefix[a]]">
> <$set name="filterB" filter="[tag[Howto]] [all[]prefix[al]]">
> <$set name="setAunionB" filter="[enlist<filterA>] [enlist<filterB>]">
> <$set name="setAnotB" filter="[enlist<filterA>] -[enlist<filterB>]">
> <$set name="setBnotA" filter="[enlist<filterB>] -[enlist<filterA>]">
> <$set name="setAinterB" filter="[enlist<setAunionB>] -[enlist<setAnotB>] 
> -[enlist<setBnotA>]">
>
> <<list-links "[enlist<setAinterB>sort[]]">>
>
> </$set>
> </$set>
> </$set>
> </$set>
> </$set>
>
>
> *Caveat* : if a filter output contains double brackets (say a tiddler 
> named "oh what a [[bad]] name") it breaks the enlist processing, and you 
> won't have the correct output.
>
>
> Best,
> Eric
>

-- 
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 tiddlywiki+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tiddlywiki/4575b9d9-66e5-4d4e-adf9-15ff6c4722ad%40googlegroups.com.

Reply via email to