Dear Evan,

Thanks for clarifying. It all makes sense to me now. I wonder how long I
will be able to remember these distinctions though!

I have defined a macro that seems to be quite close to what you are
suggesting:

\define traverseDescendants(tag, displayMacro)
    <$list filter="[tag[$tag$]tag[concept]]">
        <$macrocall $name="$displayMacro$" />
        <$macrocall $name="traverseDescendants" tag=<<currentTiddler>>
displayMacro="$displayMacro$" />
    </$list>
\end

It takes a tag as a parameter (when called from the outside, the root of
the tree to be traversed) and the name of a macro to invoke for each
tiddler in the tree. I have added the tag "concept" to the filter in order
to get just the tree of concepts because I use concepts to tag other kinds
of tiddlers. The display macro passed to traverseDescendants could then
display something else entirely. In my case, that would be all memos tagged
with any concept in the tree.

Because memos in my wiki may be tagged with several concepts, I still face
the problem of defining the display macro so that duplicates are removed. I
am going to look into this now.

Best regards,
Linus


2015-09-13 20:07 GMT+02:00 Evan Balster <balster.e...@gmail.com>:

> Here's an approach which doesn't require assembling an intermediate list.
> Like my last example, this is most easily demonstrated by creating a new
> tiddler on TiddlyWiki.com and previewing it.
>
>
> \define heirarchy_sub()
> <$list filter="[tag{!!title}]">
> <li> <$link>{{!!title}}</$link> </li>
> <ul>
> <$macrocall $name="heirarchy_sub">>
> </ul>
> </$list>
> \end
>
> \define heirarchy(ROOT)
> <$tiddler tiddler="$ROOT$"><<heirarchy_sub>></$tiddler>
> \end
>
> <ul>
> <<heirarchy "TableOfContents">>
> </ul>
>
>
> On Sunday, 13 September 2015 12:44:05 UTC-5, Evan Balster wrote:
>>
>> 2)  The reason for this behavior is that macros do not set variables.
>> They're a text replacement system, and widgets (like <$list> or <$set>) are
>> not run until the macro has been applied.  $(variable)$ is a substitution
>> that happens within the macro, while <<variable>> happens after.  These
>> subtleties can make TiddlyWiki programming a bit of a headache at times.
>>
>> 3)  A good way to debug filter generation is to use a <$text> widget,
>> which will display the output of a macro without further parsing.  IE, it
>> will use the same rule to display the result of a macro as would be used if
>> that macro was used as a filter.
>>
>> As a test, I made a few small modifications to your code and pasted the
>> following into a new tiddler on TiddlyWiki.com:
>>
>> \define listDescendants(tag)
>>     &#91;&#91;$tag$&#93;&#93;
>>
>>     <$list filter="[tag[$tag$]]">
>>         &#91;&#91;<$view field="title" />&#93;&#93;
>>         <$macrocall $name="listDescendants" tag=<<currentTiddler>> />
>>     </$list>
>> \end
>>
>> \define myMacro()
>>
>> <$set name="myList" value=<<listDescendants "HelloThere">> >
>> <$set name="finalFilter" value=<<assembleFilter>> >
>>
>> <<<
>> <$text text=<<finalFilter>>/>
>> <<<
>>
>> <<myMacro2>>
>> </$set>
>> </$set>
>> \end
>>
>> \define assembleFilter()
>> $(myList)$
>> \end
>>
>> \define myMacro2()
>> <$list filter=<<finalFilter>> >
>> <<showListItem>>
>> </$list>
>> \end
>>
>> \define showListItem()
>> &raquo; <$link to={{!!title}}><$view field="caption" ><$view
>> field="title" /></$view></$link><br>
>> \end
>>
>> <<myMacro>>
>>
>>
>> The output of that includes a bunch of garbage information, and a listing
>> of the tiddlers which are direct descendants of the "root concept".  The
>> reason is that the filter you're generating, as indicated by the Text
>> widget, is this:
>>
>> &#91;&#91;HelloThere&#93;&#93; <$list filter="[tag[HelloThere]]">
>> &#91;&#91;<$view field="title" />&#93;&#93; <$macrocall
>> $name="listDescendants" tag=<<currentTiddler>> /> </$list>
>>
>> All of that goes into the filter parser, which interprets everything
>> other than [tag[HelloThere]] as a tiddler to be included in the list.
>> The <$list> widget is not executed beforehand.  Because none of those junk
>> tiddlers exist with a tag "concept", you don't see them when running your
>> own code.  The children of HelloThere show up as normal, however.
>>
>> See the attached screenshot, showing what the rendered page (with all
>> junk tiddlers) looks like.
>>
>> The take-away from all this is that there is *no wikification* of text
>> that gets fed into attributes such as filters -- TiddlyWiki would need 
>> additional
>> functionality
>> <https://groups.google.com/d/topic/tiddlywiki/E_JbL_5TGyY/discussion>
>> for this to be possible.  It's another conceptual headache with the
>> relation between macros and widgets that took me a long time to understand.
>>
>> If you want to do what you're trying to do, you'll probably need to start
>> over with a technique that doesn't involve generating a filter or list.
>> Try just printing the name of each item in your heirarchy individually.
>>
>>
>> On Sunday, 13 September 2015 03:49:13 UTC-5, Linus Johnsson wrote:
>>>
>>> Through your suggestions I have made at least some progress. Given the
>>> code
>>>
>>> \define listDescendants(tag)
>>>     &#91;&#91;$tag$&#93;&#93;
>>>     <$list filter="[tag[$tag$]tag[concepts]]">
>>>         &#91;&#91;<$view field="title" />&#93;&#93;
>>>         <$macrocall $name="listDescendants" tag=<<currentTiddler>> />
>>>     </$list>
>>> \end
>>>
>>> \define myMacro()
>>> <$set name="myList" value=<<listDescendants "NameOfConceptTiddler">> >
>>> <$set name="finalFilter" value=<<assembleFilter>> >
>>> <<myMacro2>>
>>> </$set>
>>> </$set>
>>> \end
>>>
>>> \define assembleFilter()
>>> $(myList)$ +[tagging[]tag[memos]]
>>> \end
>>>
>>> \define myMacro2()
>>> <$list filter=<<finalFilter>> >
>>> <<showListItem>>
>>> </$list>
>>> \end
>>>
>>> \define showListItem()
>>> &raquo; <$link to={{!!title}}><$view field="caption" ><$view
>>> field="title" /></$view></$link><br>
>>> \end
>>>
>>> <<myMacro>>
>>>
>>> I do get a list of memos tagged with concepts in the tree that I am
>>> traversing, but strangely enough it does not include those tagged only with
>>> the ancestor. Any ideas?
>>>
>>> @Evan, some comments on your notes:
>>>
>>> 1) Check.
>>>
>>> 2) It appears that $(variable)$ does not always work inside macros
>>> either. For instance, given that finalFilter is a variable defined in the
>>> enclosing macro myMacro2,
>>>
>>> \define myMacro2()
>>> <$list filter=<<finalFilter>> >
>>> <<showListItem>>
>>> </$list>
>>> \end
>>>
>>> works, while
>>>
>>> \define myMacro2()
>>> <$list filter=$(finalFilter)$ >
>>> <<showListItem>>
>>> </$list>
>>> \end
>>>
>>> does not.
>>>
>>> 3) Using <$set> as in the above example appears to be a rather simple
>>> workaround given the limitations of <$filter>.
>>>
>>>
>>> Best regards,
>>> Linus
>>>
>>>
>>>
>>> 2015-09-12 19:17 GMT+02:00 Evan Balster <balste...@gmail.com>:
>>>
>>>> A few notes:
>>>>
>>>> 1) Macros always have to be at the top of the file, before any WikiText.
>>>>
>>>> 2) The syntax $(variable)$ only applies inside macros.  Outside macros,
>>>> use <<variable>>.
>>>>
>>>> 3) Your trick isn't working because there's no way to *render*
>>>> WikiText into a filter expression.  Basically, the code inside <<myList>>
>>>> doesn't get executed if it's passed to an attribute like <$list
>>>> filter=<<mylist>> >.  I've just opened a topic suggesting a feature which
>>>> would make this possible:  read here
>>>> <https://groups.google.com/d/topic/tiddlywiki/E_JbL_5TGyY/discussion>.
>>>> That said, it's likely there are other ways to solve your problem which
>>>> don't involve composing an intermediate list.
>>>>
>>>>
>>>> On Saturday, 12 September 2015 05:42:35 UTC-5, Linus Johnsson wrote:
>>>>
>>>>> Thank you for your kind replies. Both suggestions rendered brackets
>>>>> just fine. As you seem to have anticipated, this immediately landed me in 
>>>>> a
>>>>> different kind of problem. I defined the following macro:
>>>>>
>>>>> \define listDescendants(tag)
>>>>>     <$list filter="[tag[$tag$]tag[concepts]]">
>>>>>         &#91;&#91;<$view field="title" />&#93;&#93;
>>>>>         <$macrocall $name="listDescendants" tag=<<currentTiddler>> />
>>>>>     </$list>
>>>>> \end
>>>>>
>>>>> The macro works as intended. I do not understand, however, why the
>>>>> following (trivial) examples will not reproduce the list returned by the
>>>>> macro. I need to get this to work in order before I add filter runs. 
>>>>> First,
>>>>>
>>>>> <$set name="myList" value=<<listDescendants "NameOfConceptTiddler">> >
>>>>> <$list filter=<<myList>> />
>>>>> </$set>
>>>>>
>>>>> returns the macro code itself, with the spaces between the tokens
>>>>> removed. As for my second attempt,
>>>>>
>>>>> <$set name="myList" value=<<listDescendants "NameOfConceptTiddler">> >
>>>>> <$list filter="$(myList)$" />
>>>>> </$set>
>>>>>
>>>>> it just returns "$(myList)$".
>>>>>
>>>>> Wrapping the calling code in a macro does not work either:
>>>>>
>>>>> \define myMacro
>>>>> <$set name="myList" value=<<listDescendants "NameOfConceptTiddler">> >
>>>>> <$list filter=$(myList)$ />
>>>>> </$set>
>>>>> \end
>>>>>
>>>>> <<myMacro>>
>>>>>
>>>>> All I get is "\define myMacro $(myList)$ \end".
>>>>>
>>>>> I am thoroughly confused. Obviously there is something about the
>>>>> syntax that I have not yet grasped. Please enlighten me!
>>>>>
>>>>> Best regards,
>>>>> Linus
>>>>>
>>>>>
>>>>> 2015-09-11 4:02 GMT+02:00 'c pa' via TiddlyWiki <
>>>>> tiddl...@googlegroups.com>:
>>>>>
>>>>>> Linus,
>>>>>>
>>>>>> Ahhh, the old create a list and then parse it trick. I have done that
>>>>>> before. I think what I ended up doing is storing the list in a temporary
>>>>>> tiddler's list  and then parsing that list to get the results
>>>>>>
>>>>>> You can use &#91; and &#93; to create square brackets
>>>>>>
>>>>>> So something like &#91;&#91;<$view field="title"/>&#93;&#93; will
>>>>>> create the title
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> You received this message because you are subscribed to a topic in
>>>>>> the Google Groups "TiddlyWiki" group.
>>>>>> To unsubscribe from this topic, visit
>>>>>> https://groups.google.com/d/topic/tiddlywiki/XH4tgLlr7fY/unsubscribe.
>>>>>> To unsubscribe from this group and all its topics, send an email to
>>>>>> tiddlywiki+...@googlegroups.com.
>>>>>> To post to this group, send email to tiddl...@googlegroups.com.
>>>>>> Visit this group at http://groups.google.com/group/tiddlywiki.
>>>>>> To view this discussion on the web visit
>>>>>> https://groups.google.com/d/msgid/tiddlywiki/c052b929-6b6b-492d-8b75-0bdf2df6b3d9%40googlegroups.com
>>>>>> <https://groups.google.com/d/msgid/tiddlywiki/c052b929-6b6b-492d-8b75-0bdf2df6b3d9%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>> --
>>>> You received this message because you are subscribed to a topic in the
>>>> Google Groups "TiddlyWiki" group.
>>>> To unsubscribe from this topic, visit
>>>> https://groups.google.com/d/topic/tiddlywiki/XH4tgLlr7fY/unsubscribe.
>>>> To unsubscribe from this group and all its topics, send an email to
>>>> tiddlywiki+...@googlegroups.com.
>>>> To post to this group, send email to tiddl...@googlegroups.com.
>>>> Visit this group at http://groups.google.com/group/tiddlywiki.
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/tiddlywiki/3e9b1041-7721-479d-96f3-a7e9eb4c7930%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/tiddlywiki/3e9b1041-7721-479d-96f3-a7e9eb4c7930%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>> --
> You received this message because you are subscribed to a topic in the
> Google Groups "TiddlyWiki" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/tiddlywiki/XH4tgLlr7fY/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> tiddlywiki+unsubscr...@googlegroups.com.
> To post to this group, send email to tiddlywiki@googlegroups.com.
> Visit this group at http://groups.google.com/group/tiddlywiki.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/tiddlywiki/e52e2c41-93c3-4553-bfa2-26ea7d41a02d%40googlegroups.com
> <https://groups.google.com/d/msgid/tiddlywiki/e52e2c41-93c3-4553-bfa2-26ea7d41a02d%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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 post to this group, send email to tiddlywiki@googlegroups.com.
Visit this group at http://groups.google.com/group/tiddlywiki.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tiddlywiki/CANHXGJQsf-83NF7oKNUNikToaHOj9J31h91yXHut6-ftS%3DXz6w%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to