I just noticed that the above code does not call displayMacro for the root. This does the trick though:
\define traverseDescendants(tag, displayMacro) <$tiddler tiddler="$tag$"> <$macrocall $name="$displayMacro$" /> </$tiddler> <$list filter="[tag[$tag$]tag[§begrepp]]"> <$macrocall $name="traverseDescendants" tag=<<currentTiddler>> displayMacro="$displayMacro$" /> </$list> \end Best regards, Linus 2015-09-15 10:08 GMT+02:00 Linus Johnsson <lins...@gmail.com>: > 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) >>> [[$tag$]] >>> >>> <$list filter="[tag[$tag$]]"> >>> [[<$view field="title" />]] >>> <$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() >>> » <$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: >>> >>> [[HelloThere]] <$list filter="[tag[HelloThere]]"> >>> [[<$view field="title" />]] <$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) >>>> [[$tag$]] >>>> <$list filter="[tag[$tag$]tag[concepts]]"> >>>> [[<$view field="title" />]] >>>> <$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() >>>> » <$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]]"> >>>>>> [[<$view field="title" />]] >>>>>> <$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 [ and ] to create square brackets >>>>>>> >>>>>>> So something like [[<$view field="title"/>]] 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/CANHXGJSibq%2Bijm6B3ninAFNpz-VX7QQtyWfsuGytJWE6gp2BnA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.