Holy guacamole, that is a thing of beauty.

I think I get it.  Seeing a macro and filter in the context of some thing I 
want to do, that kind of practical perspective makes things pretty clear.

Thank-you so much !  I have to figure out how to intertwingle some studying 
time (for all of this) with all of my little projects.

FUN!

On Monday, September 14, 2020 at 8:31:27 AM UTC-3, Felicia Crow wrote:
>
> Hi,
> so actually the answer is probably not going to be much longer it just 
> contains a macro example and an explanation of how it works. The macro 
> itself can live in any tiddler tagged with $:/tags/Macro.
>
> So first here is the actual macro:
> \define RenderContent(id)
> <$vars purpose={{{[has[purpose]get[purpose]]}}} id="$id$">
> <$list filter="[!has[draft.of]field:tiddler-id<id>field:context<purpose>]"
> >
> <$transclude tiddler=<<currentTiddler>> mode="block"/>
> </$list>
> </$vars>
> \end
>
> And while it is a more configureable version of my former solution here is 
> a breakdown of how it works
>
>    - First the macro sets two variables: Purpose via an inline filter and 
>    id which it gets from the macro parameter. For the inline filter all it 
>    does is looking for a tiddler with the field purpose and then gets this 
>    fields value. This stops the reliance on title, but you will have to 
> ensure 
>    that there is always only one purpose field within the wiki.
>    - The list filter then looks for a tiddler that is not currently being 
>    in editmode - the !has[draft.of] part - and has two fields matching the 
>    values from the variables. For one the context field being the same as 
>    whatever is currently in purpose and the tiddler-id field being the same 
> as 
>    the id passed to the macro.
>    - When a tiddler fullfilling these conditions is found it is 
>    transcluded at the place the macro was called from.
>
>
> To use the macro here is an example using Contents, but it is the exact 
> same process for Title, Subtitle, every future tiddler having different 
> text depending on context just with a different id.
>
>    - In the Contents tiddler you replace your line with the two 
>    transclusions with <<RenderContent "Contents">>.
>    - In Contents (Product Reviews) you add two fields. One is called 
>    context and has a value of ProductReviews the other is called tiddler-id 
>    and gets a value of Contents.
>    - In Contents (Urban Off Gridding) the same two fields are added, just 
>    that context now has a value of OffGridding.
>
> That's it, nothing changes visually, but if you decide that Contents - 
> Product Reviews is a better title for instance the macro still works as 
> expected.
>
> Since I worked with a local copy of your wiki to ensure that the macro is 
> working as intended with the wiki it is inteded for I attached a json file 
> containing the ten tiddlers - the macro itself plus the changed versions of 
> Contents, Title, Subtitle - that you can just import and everything is set 
> up as I described above should you prefer this route.
>
> Kind Regards,
> Felicia
>
>
> On Monday, 14 September 2020 04:00:09 UTC+2, Felicia Crow wrote:
>>
>> Seeing how I may should eventually remember that sleeping at night is a 
>> thing a short answer for now, but I will return with a longer answer and 
>> possible examples later.
>>
>> The solution was mostly to keep it within the current framework and not 
>> changing too much around. For a more centralised approach to the whole 
>> system tags and or fields will probably get a more prominent role, both for 
>> minimizing code duplication as well as dropping a reliance on titles.
>> For instance the Content and Title tiddler could call the same macro with 
>> their type - content and title respectively in this case - and the macro 
>> filters for a tiddler with two fields: one named tiddler-type matching what 
>> was send to the macro and the other named context matching the context 
>> currently in your purpose field. Since this match is made via the two 
>> fields the title also doesn't matter. This tiddler or more correctly its 
>> title is returned to the tiddler which then transcludes the result.
>>
>> I will write a more concrete example when my brain isn't on standby but 
>> actually working again, but I hope that this may give you some idea already.
>>
>>
>>
>> On Monday, 14 September 2020 02:58:31 UTC+2, Charlie Veniot wrote:
>>>
>>> That looks A-1 to do on one tiddler needing to decide what content to 
>>> show based on context, but how to do that once so that it can be used for a 
>>> plethora of tiddlers that show different content based on context?
>>>
>>> I would not want to put that kind of code on each of my 
>>> multi-context-handling tiddlers.
>>>
>>> For that code to exist generically once, I imagine each 
>>> multi-context-tiddler would need some kind of macro call like:  
>>> <<SetContextContent "Product Reviews Tiddler Name" "Urban Off Gridding 
>>> Tiddler Name">>
>>>
>>> Aside from not doing that myself (for lack of macro and filter 
>>> knowledge), I didn't want to go there because I often get tripped up 
>>> setting these things up to not get screwed up every time I change tiddler 
>>> titles (which I do repeatedly trying to get titles juuuuuust right.)
>>>
>>> Thoughts?  (i.e. how to do that so that both "Contents" tiddler and 
>>> "Title" tiddler can call some macro that does what your code does, but 
>>> works generically for every tiddler that needs it?)
>>>
>>> On Sunday, September 13, 2020 at 9:22:13 PM UTC-3, Felicia Crow wrote:
>>>>
>>>> Charlie,
>>>>
>>>> so first things first here is my version. This specific code would go 
>>>> into Content, but it would look nearly the same with the other tiddlers. 
>>>>
>>>
>>>> <$set name="purpose" filter="[[Alternate TiddlyWiki 
>>>> Purposes]get[purpose]]">
>>>> <$list filter="[<purpose>match[ProductReviews]]">
>>>> {{Contents (Product Reviews)}}
>>>> </$list>
>>>> <$list filter="[<purpose>match[OffGridding]]">
>>>> {{Contents (Urban Off Gridding)}}
>>>> </$list>
>>>> </$set>
>>>>
>>>> As for the explanation:
>>>>
>>>>    - The filter within set gets the current value of the purpose field 
>>>>    that is in the tiddler with the title Alternate TiddlyWiki Purposes.
>>>>    - The filter in the list widget takes whatever was saved in set and 
>>>>    compares it to the parameter in match. If it matches the list widgets 
>>>>    content will be rendered.
>>>>
>>>>
>>>> The code in itself does pretty much the same as your two transclusion 
>>>> templates just in one place, so I think it mostly comes down to personal 
>>>> preference where you check what actually needs to be rendered.
>>>>
>>>> The only thing I could think of what this solution currently does 
>>>> better is being more failsafe in its execusion. The way the transclusion 
>>>> tiddlers in your version are written they only look for fields named 
>>>> purpose which contains their respective value, so when one adds a field 
>>>> purpose to another tiddler and gives it the opposite value both versions 
>>>> will be rendered at the same time. Since this is a wiki only edited by you 
>>>> this probably won't happen, just realized it when I looked once more at 
>>>> your templates while I wrote down my version.
>>>>
>>>> Felicia
>>>>
>>>>
>>>> On Monday, 14 September 2020 01:23:18 UTC+2, Charlie Veniot wrote:
>>>>>
>>>>> G'day Felicia,
>>>>>
>>>>> Sure, I'd love to see how you'd go about it.  
>>>>>
>>>>> Since there are always multiple ways of doing things, if you have the 
>>>>> time: quick thoughts on advantages/disadvantages of both for a quick back 
>>>>> and forth about them?  Might be a pretty short back and forth: I don't 
>>>>> have 
>>>>> enough know-how to pickout the "pitfalls" (or "trappings") of various 
>>>>> approaches?
>>>>>
>>>>> That aside: I'm kind of proud to have figured out a little something 
>>>>> about filters in my last post 
>>>>> <https://groups.google.com/g/tiddlywiki/c/ItNqeGWYX7Q>.
>>>>>
>>>>> On Sunday, September 13, 2020 at 6:03:04 PM UTC-3, Felicia Crow wrote:
>>>>>>
>>>>>> Hi Charlie,
>>>>>>
>>>>>> yes that was what I meant. I always find it interesting to learn the 
>>>>>> thought process behind someones solution, since it often gives a 
>>>>>> different 
>>>>>> perspective on things that I would not have considered before, leads to 
>>>>>> learning something new or both. So when I saw a solution I would not 
>>>>>> have 
>>>>>> thought of myself I was curious how this came to be.
>>>>>>
>>>>>> I sadly don't have any real tips for learning filters as it is one of 
>>>>>> the things my brain was actually willing to learn at least the basics 
>>>>>> quite 
>>>>>> quickly, but if you want I could write up the solution I had in mind so 
>>>>>> that you can play around with it, if this would be something that 
>>>>>> interests 
>>>>>> you/could help you.
>>>>>>
>>>>>> And to add something useful to the babbling at the top: A short 
>>>>>> excursion about the difference between non-javascript and javascript 
>>>>>> macros 
>>>>>> at least as far as I learned it - definitely not an expert.
>>>>>>
>>>>>>
>>>>>>    - Javascript macros are loaded in with everything else javascript 
>>>>>>    before any processing happens as this is so to speak the engine on 
>>>>>> which 
>>>>>>    everything runs, so yes a javascript macro is already loaded in when 
>>>>>> the 
>>>>>>    startup actions are run.
>>>>>>    - Non-javascript macros one the other hand exist at first only 
>>>>>>    within the tiddler they where defined in. So for example if you have 
>>>>>> a 
>>>>>>    tiddler containing the definition for a macro called get-context you 
>>>>>> would 
>>>>>>    only be able to use this macro in the same tiddler. This is where 
>>>>>> then the 
>>>>>>    import pragma and tag $:/tags/Macro come in. Import is used as you 
>>>>>> have 
>>>>>>    done to allow use of a specific macro in the tiddler it was imported 
>>>>>> to. 
>>>>>>    The tag $:/tags/Macro on the other hand allows you to mark the macro 
>>>>>> as 
>>>>>>    global so that you can use it where ever you want without having to 
>>>>>>    specifically import it each time. This is were the exception you 
>>>>>> reference 
>>>>>>    comes in. Since the startup actions run before the tagged macros are 
>>>>>>    processed to make them globally available you need to import 
>>>>>> non-javascript 
>>>>>>    macros even if they are properly tagged.
>>>>>>    
>>>>>>
>>>>>> Hope you can take away at least something from this and it wasn't too 
>>>>>> confusing.
>>>>>>
>>>>>> Happy Sunday for you as well.
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Sunday, 13 September 2020 20:47:35 UTC+2, Charlie Veniot wrote:
>>>>>>>
>>>>>>> G'day Felicia,
>>>>>>>
>>>>>>> Hi Charlie,
>>>>>>>>
>>>>>>>> love the concept and very impressiv what you managed to put 
>>>>>>>> together, thank you for sharing.
>>>>>>>>
>>>>>>>
>>>>>>> Thank-you!  Of course, let's keep in mind that, in martial arts 
>>>>>>> terms, I'm not quite a TiddlyWiki yellow belt yet, so I'm sure there 
>>>>>>> are 
>>>>>>> many things that could be improved !
>>>>>>>  
>>>>>>>
>>>>>>>>
>>>>>>>> If you don't mind asking, is there a specific reason for placing 
>>>>>>>> the decision for what to transclude in the two templates themselves 
>>>>>>>> and 
>>>>>>>> always calling both of them?
>>>>>>>> Personally I would have put the decision in the root tiddler - e.g. 
>>>>>>>> TiddlyWiki Title - via a match filter and only called what was needed, 
>>>>>>>> so I 
>>>>>>>> wonder if there is something I am missing/not thinking about or if it 
>>>>>>>> is 
>>>>>>>> just another case of multiple ways to achieve the same result.
>>>>>>>>
>>>>>>>
>>>>>>> I suspect that you are talking about this way of deciding what to 
>>>>>>> show based on context: {{TiddlyWiki Title 1||tPr}}{{TiddlyWiki Title 
>>>>>>> 2||tOg}}
>>>>>>>
>>>>>>> I chose that way of doing things because I'm having a hard time 
>>>>>>> wrapping my mind around filters, but I think I've got transclusion 
>>>>>>> templates down pat.
>>>>>>>
>>>>>>> So I saw that mechanism as a quick (and non-cryptic) and easily 
>>>>>>> repeatable method across the board, for example:
>>>>>>>
>>>>>>>    - the "content" tiddler (included in my "navigation" tiddler 
>>>>>>>    that shows in the sidebar) has {{Contents (Product 
>>>>>>>    Reviews)||tPr}}{{Contents (Urban Off Gridding)||tOg}} to show 
>>>>>>> different 
>>>>>>>    navigation links depending on context
>>>>>>>    - I may want to show other tiddlers different ways depending on 
>>>>>>>    context ...
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> Oh and one thing I noticed, just as an info: Since 
>>>>>>>> getstartupcontext is a javascript macro you don't actually need to 
>>>>>>>> import 
>>>>>>>> it. Unlike normal macros javascript macros are always global.
>>>>>>>>
>>>>>>>
>>>>>>> Maybe I misunderstood something when I put that import there.  I 
>>>>>>> thought that "StartupAction" tiddlers, because they are processed so 
>>>>>>> early, 
>>>>>>> didn't have access to any macros unless they are imported.  Does that 
>>>>>>> just 
>>>>>>> apply to non-javascript macros ?
>>>>>>>  
>>>>>>>
>>>>>>>>
>>>>>>>> Kind Regards,
>>>>>>>> Felicia
>>>>>>>>
>>>>>>>
>>>>>>> Cheers, best regards, and Happy Sunday !
>>>>>>>  
>>>>>>>
>>>>>>

-- 
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/4f1d9d83-99c7-4b9a-a070-7d5356d7766do%40googlegroups.com.

Reply via email to