Sort tiddlers by substring?

79 views
Skip to first unread message

amreus

unread,
Sep 5, 2020, 5:10:56 PM9/5/20
to TiddlyWiki
My "people" tiddlers consist of the person's name and an ID number to make them unique. How can I sort the tiddlers by the ID number?

example title: Karl Roger Stanton (I234)

Thanks.

Mark S.

unread,
Sep 5, 2020, 6:05:30 PM9/5/20
to TiddlyWiki
You will likely save yourself hours of headaches if you create separate fields for id and name.

Eric Shulman

unread,
Sep 5, 2020, 6:22:42 PM9/5/20
to TiddlyWiki
On Saturday, September 5, 2020 at 2:10:56 PM UTC-7, amreus wrote:
My "people" tiddlers consist of the person's name and an ID number to make them unique. How can I sort the tiddlers by the ID number?
example title: Karl Roger Stanton (I234)

This is hard to do (but still possible) using the current version of TW (5.1.22)

However, it is very easy using the new "sortsub" filter that is available in the next update (5.1.23)
currently in "pre-release"... see https://tiddlywiki.com/prerelease/#sortsub%20Operator)

Let's start by assuming that all your "people" tiddlers are tagged with "people" so you can find them easily.

Then, to sort by ID number extracted from the tiddler titles, use the "sortsub" filter, like this:
\define sub() [split[(]rest[]split[)]first[]]
<$list filter="[tag[people]sortsub<sub>]">
   
<<currentTiddler>><br>
</$list>

Notes:
* The $list finds all "people" tiddlers.
* The sub() macro defines the filter to extract the ID from each title
* The sortsub[] filter uses the extracted ID values to sort the titles in ascending order

Here's how to do the same thing using the current TW5.1.22:
\define getList()
<$list filter="[tag[people]]">
   
<$vars id={{{ [<currentTiddler>split[(]rest[]split[)]first[]] }}}>
     
<$text text="[["/><<id>>;<<currentTiddler>><$text text="]]"/>
   
</$vars>
</
$list>
\end

<$wikify name="people" text=<<getList>>>
<$list filter="[enlist<people>sort[]]">
   
{{{ [<currentTiddler>split[;]rest[]] }}}<br>
</$list>
</
$wikify>

Notes:
* getList() finds all "people" tiddler and, for each, it outputs a string of the form: [[id;tiddlertitle]], including the square brackets (to allow for titles with spaces)
* $wikify invokes <<getList>> and converts the macro output into plain text
* $list enlists this text (converting it to a list of separate items) and then sorts it by the ID (which is now a prefix on each title)
* Then, it outputs each item, removing the prefix and the ";" used as a delimiter
* The result is the original list of [tag[people]], sorted by ID.

Hope this helps,

-e

amreus

unread,
Sep 6, 2020, 5:45:35 AM9/6/20
to TiddlyWiki
Heh, thank. That is exactly my current solution.

I am wondering if there could be a new filter (or option) in the "nsort" family of filters which would ignore any non-number characters.  I looked at the Javascript functions in sort.js and the sortTIddlers function in wiki.js for a clue but I need to study that a bit more to understand how sorting works.

My initial thought would be to use Javascript's String.replace() to remove any non-numeric characters from the titles and then pass them on to nsort.

Thanks.

amreus

unread,
Sep 6, 2020, 6:22:57 AM9/6/20
to TiddlyWiki
Eric,

Outstanding.  Thanks for sharing your expertise.

I happen to be using 5.1.23-prerelease, so the new sortsub filter works perfectly.  Also thank you for the example of splitting sub-strings using split and rest, as well as the technique for creating a temporary list, sorting that, and then deconstructing the list.  It's a mini master-class.
Reply all
Reply to author
Forward
0 new messages