Werner,

An Example of using count and range for a given set of titles. Works on 
Tiddlywiki.com

\define all-items(items)
$items$<br>
<$list filter="[range[1,$items$]]" variable=item-number>
   <$macrocall $name=each-item item=<<item-number>>/>
</$list>
\end
\define each-item(item)
Item #$item$ {{{ [tag[TableOfContents]sort[]nth[$item$]] }}}<br>
\end

<$macrocall $name=all-items items={{{ [tag[TableOfContents]count[]] }}}/>


   - First I call all-items providing the total number of items I am going 
   to process with count
      - This is done so I can use the $items$ as replaceable parameter in 
      the range operator
   - Now I can process each item number, and access the specific item using 
   the nth operator.
   - Notice the sort at the last moment (each-item) this can be changed or 
   removed (for natural order) 

But it is important to note if you do not need the number of each item that 
filters naturally process the set of titles they generate, and return to 
the "calling process" when finished.

Nested list widgets, even recursive (call them self)  will return to the 
previous level when the new filter (if) it is exhausted. In effect do until 
end of list.

Another way is to iterate a list and and determine the position of each 
item in the list, each time.

For example this macro returns the position of currentTiddler in the 
natural list of items tagged page.
\define position() <$list filter=
"[tag[page]allbefore<currentTiddler>count[]add[1]]" variable=position><$text 
text=<<position>>/></$list>
In this case the position is determined for each tiddler, rather than using 
the range widget to provide the position.

Regards
Tony



On Friday, 28 August 2020 03:02:40 UTC+10, Werner wrote:
>
> Thanks, Tony, for pointing me at the range[] operator. Could you elaborate 
> a bit on how you use it. So far I've gotten by using the <$list> widget, 
> but your approach might be more efficient than mine.
>
> Here's what I'm doing when looping through JSON data
>
> <$set name="actions" filter="[all[current]indexes[Actions]sort[]]" > <!--- 
> indexes[] doesn't necessarily provide the correct sorting order -->
> <$set name="actionCount" filter="[<actions>split[ ]count[]]" > <!-- 
> needed later for determining rowspan value -->
> <!-- start loop through actions; fetch array indexes -->
> <$list variable="currentAction" filter=<<actions>> >
> ...
> </$list>
> </$set>
> </$set>
>
> Speaking of tables, is there anything to be aware of, as to how TW injects 
> HTML tags? I can't seem to get <tr> and </tr> right in my dynamically 
> created nested table. I have delegated some code to conditionally executed 
> macros, and Chrome seems go get confused, when a </tr> is used at a 
> position it doesn't like.
>
> EDIT: The last issue is solved. Found a cleaner way to build the table. 
> Set the <tr> tags at the lowest level and insert <td>s for the higher 
> levels only when needed
>
> Thanks again
> Werner
>
> Am Donnerstag, 27. August 2020 04:01:09 UTC+2 schrieb TW Tones:
>>
>> Werner,
>>
>> The exact detail needs to be worked out but I agree with Saq its all 
>> doable in wikitext. I also use the HTML table tags rather than tiddlywiki 
>> table markup. As long as you do not break the rules of html tables its easy 
>> to have a variable number or rows or columns in a table if you wrap that 
>> element in another and use a list to iterate the items. Boarders and 
>> setting column title sis a little more tricky but doable
>>
>> Rather than rowspan you can iterate the cells but display: none; and 
>> other methods.
>>
>> Also remember you can use the count widget or count operator to determine 
>> how many items in a set and use the range operator to iterate them once you 
>> know.
>>
>> Effectively you nest list widgets within table elements.
>>
>> Regards
>> Tony
>>
>>
>> On Thursday, 27 August 2020 05:16:30 UTC+10, Werner wrote:
>>>
>>> Good evening guys, me again.
>>>
>>> I understand that the scope of a variable is defined by the enclosing 
>>> <$vars> <$set> or <$wikify> widgets. I also understand that any new <$set> 
>>> widget opens up a new scope, where a variable <myVar> defined in an outer 
>>> scope would be overridden. I am facing a problem where I would need to 
>>> access out-of-scope variables (or come up with a completely different 
>>> approach).
>>>
>>> I am still working on a set of double-nested JSON data (using Josh 
>>> Fontany's JSONmangler plugin). I want to display the content of the data in 
>>> a table using table cells spanning multiple rows like <td rowspan = "5">. 
>>> The problem here is, the rowspan is defined by the number of elements in 
>>> the lowest nested level and I would need it before rendering the table and 
>>> looping through the array elements fetching the data. So typically, in a 
>>> garden variety programming language, I would do something as follows:
>>>
>>> totalRows = 0
>>> Loop through Level1
>>>    nestedRows= Level2.count()
>>>    totalRows += nestedRows
>>> End Loop
>>>
>>> Could anybody enlighten me, if a construct like this is possible in TW 
>>> and how I would achieve it?
>>>
>>> Two fallback options: 
>>> - storing the number of elements in the JSON structure (yuck - feels 
>>> like cheating).
>>> - throwing the whole JSON data structure at an JS macro. Positive side 
>>> effect: I would have to dive into it and learn something new.
>>>
>>> Thanks for helping me out on this.
>>> Best, Werner
>>>
>>>
>>>
>>>
>>>
>>>

-- 
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/1451d338-6e17-4211-a470-bbe1bcfea1e9o%40googlegroups.com.

Reply via email to