Tony,
That was very helpful !!

As my intent is to use the result in a list widget, I went with 

1/ returning this in the macro :
<$list filter="[enlist<setAinterB>sort[]]">
  <$text text="[["/>{{!!title}}<$text text="]]"/>
</$list>

2/ storing the result with wikify :
<$wikify name=result text="""<<intersect "[tag[Todo]] [all[]prefix[a]]" 
"[tag[Howto]] [all[]prefix[al]]">>""" >

3/ using the result in various ways :
<<result>>

<$text text=<<result>>/>

and in a list, my initial intent:
<$list filter=<<result>> >

;{{!!title}}
:{{!!tags}}

</$list>

Works perfectly, thanks again ! 

Eric N.



On Thursday, May 7, 2020 at 12:09:41 PM UTC+4, TonyM wrote:
>
> Eric,
>
> You need to wikify the result of a complex macro before feeding it into 
> the next widget otherwise the macro code is included.
>
>    - One way to conceptualise this is;
>       - tiddlywiki always tries and passes the un-wikified result along 
>       so it can be "evaluated" at the last moment
>    - Use the wikify at the last minute or in the wikitext that is using 
>    the result. Unfortunately you can't move the wikify widget into a macro
>       - because it too will not be evaluated
>    - Remember - If you supply a complex macro  rather than a simple 
>    variable to a widget as a parameter it is like saying
>    Evaluate the widget, no wait first Evaluate the Parameter then 
>    evaluate the widget. See second example below
>    - If First you wikify it it becomes a simple variable with the result 
>    as already evaluated so looks more like a simple variable. 
>
>
> ;Macro Result
> <<intersect "[tag[Todo]] [all[]prefix[a]]" "[tag[Howto]] 
> [all[]prefix[al]]">>
> <hr>
>
> ;Macro used as input to the text widget
> <$text text=<<intersect "[tag[Todo]] [all[]prefix[a]]" "[tag[Howto]] 
> [all[]prefix[al]]">>/>
> <hr>
>
> ;Use as Variable after wikifying
> <$wikify name=result text="""<<intersect "[tag[Todo]] [all[]prefix[a]]" 
> "[tag[Howto]] [all[]prefix[al]]">>""" >
> <$text text=<<result>>/>
> </$wikify>
>
> Regards
> Tony
>
>
> On Thursday, 7 May 2020 15:32:10 UTC+10, Eric N. wrote:
>>
>> Thanks TonyM that's very handy !
>>
>> Would you know if there is a way to return the intersection set as a 
>> variable for later reuse ?
>> Then I wouldn't have to decide upfront what to do with the intersection 
>> in the macro.
>>
>> I mean something like:
>> f=intersect("[tag[Todo]] [all[]prefix[a]]", "[tag[Howto]] 
>> [all[]prefix[al]]")
>>
>> <<list-links "[enlist< $f$ >sort[]]">>
>>
>> <$list filter="[enlist<setAinterB>sort[]]">
>> <$link/>
>> </$list>
>>
>> ...
>>
>> But with the proper way to use variables, functions, macros, parameters, 
>> .... (what these elements are and how to use them in different contextes is 
>> still unclear to me)
>>
>> Cheers !
>>
>>
>> On Thursday, May 7, 2020 at 8:38:23 AM UTC+4, TonyM wrote:
>>>
>>> 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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tiddlywiki/fd4687b3-51a6-47c3-9756-8b70d14c416e%40googlegroups.com.

Reply via email to