glossary with diacritics

187 views
Skip to first unread message

Jean-Pierre Rivière

unread,
Oct 20, 2020, 6:50:11 PM10/20/20
to TiddlyWiki
In French, a glossary is as simple as in English except for the letter E where we also some entry starting with É to take into account.

This can be done like this:

<ul>
<$list filter="[tag[glossaire]prefix<initial>]=[tag[glossaire]prefix[é]]+[sortan[]]"><li><$link/></li>
</ul>

where initial is a variable containing "e" (my glossary is all lowercase, and each word in the entry has a tiddler tagged "glossaire").

But I want to build my glossary automatically. How can I make a special case for the E letter? My difficulty is to extend my filter (this is the part starting from the = sign). I am open t any way to achieve this.

I have tried to build a string containing "=[tag[glossaire]prefix[é]]+[sortan[]]" and to add it if initial is e, but this does not work as I have written it:

\\define glossy()
<$set name="initial" filter="[{!!title}lowercase[]]">
<$set name="special-case" value="=[tag[glossaire]prefix[é]]+[sortan[]]">

<$set name="special" filter="[<initial>compare:string:eq[e]then<special-case>]">

special <$macrocall $name="special"> now defined

<ul>
<$list filter="[tag[glossaire]prefix<initial>]<$macrocall $name="special"/>">
   <li><$link/></li>
</$list>
</ul>
</$set>
</$set>
</$set>
\end

When I use <<glossy>> in the "E" tiddler, all I can see is:

special =[tag[glossaire]prefix[é]]+[sortan[]]

and nothing else. the thing printed seems OK but is that what it seems to be? The process clearly seems to be interrupted.

TW Tones

unread,
Oct 20, 2020, 7:06:13 PM10/20/20
to TiddlyWiki
Jean-Pierre,

Just a quick idea not thought through

In the pre-release there is the sortby operator. 

Perhaps having a sort macro
\define sorter() A a B b C c D d E é e ....
Then sortby<sorter>

You may need to split[] the letters to obtain the first letter etc.

Regards Tones

TW Tones

unread,
Oct 20, 2020, 7:08:50 PM10/20/20
to TiddlyWiki
Other "half baked" ideas,

Regards
Tones

Jean-Pierre Rivière

unread,
Oct 21, 2020, 5:35:33 AM10/21/20
to TiddlyWiki
Hi Tones,

My problem is not so much the order of the letter as of now. However, your input may well serve me.

Non, my real concerne is that I am not successfull in getting a special filter for e, even though I already have this special case ready. I'm unable to connect it dynamically.

I have seen in an other thread that I can do things like <$sort filter=<<my-filter>>/>

So today I tried to build the complete filter. But I've not been sucessful at that. My attempt:

first, the filter I need for e (here within a list widget):<$set name="special" filter="[<initial>compare:string:eq[e]<special-case>]">

<$list filter="[tag[glossaire]prefix<initial>][tag[glossaire]prefix[é]]+[sortan[]]">

for all the other letter, that is only:

$list filter="[tag[glossaire]prefix<initial>]"/>

(it seems I don't need sorting then. Is that a coincidence or is it a general truth?)

What I coded:

\define glossy()
<$set name="initial" filter="[{!!title}lowercase[]]">
<$set name="special-case" value="=[tag[glossaire]prefix[é]]+[sortan[]]">

<$set name="special" filter="[<initial>compare:string:eq[e]<special-case>]">

special <<special>> now defined

<$set name="ext-filter" value="[tag[glossaire]prefix<initial>]<$macrocall $name=special>>">

ext-filter <<ext-filter>> ready

<ul>
<$list filter=<<ext-filter>>>
   <li><$link/></li>
</$list>
</ul>
</$set>
</$set>
</$set>
\end

My results:

special =[tag[glossaire]prefix[é]]+[sortan[]] now defined

ext-filter [tag[glossaire]prefix]=[tag[glossaire]prefix[é]]+[sortan[]] ready

en-tête de colonne ou de ligne
ensemble de pages
environnement maîtrisé
<$macrocall
$name=special>>

If I omit the double quotes arount the filter value in setting ext-filter, I'm getting a grammar error (no big surprise!)/

Xavier Cazin

unread,
Oct 21, 2020, 7:23:56 AM10/21/20
to tiddl...@googlegroups.com
Hi Jean-Pierre,

I was about to point you to dictionaries and suggest that you use getindex<>, but now I'm not sure if I understand your issue correctly. One sure thing however: you cannot insert a filter string like <<special-case>> into an existing filter expression by simply referencing the string variable. This is the main reason of the errors you get. Instead, you need to use the subfilter operator.

Cheers,
-- Xavier


--
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+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/tiddlywiki/1f645183-dce9-4a0c-9679-4b33f7d27cf3n%40googlegroups.com.

Jean-Pierre Rivière

unread,
Oct 22, 2020, 12:57:26 PM10/22/20
to TiddlyWiki
Hi Xavier!

I've already used subfilter. As I used it and understood it, it is of use as a substitude for mapping within filters. But yes, I can map an array of just one element. I did not think of that.

As for dictionnary, I was already planning its use. But to mark "é" as a co-letter for "e", nothing more. But from there, my problem is to build dynamically the filter for each letter and especially for "e".

Subfilter allow writing something like 

subfilter<first-select-filter> prefix[e]

but not something like 

subfilter<first-select-filter> <second-filter>

And since there is no filter that could have conditional filter (we can only have conditional strings with "then" and "else"), I cannot see where subfilter may help me.

So I looked for another way: using "regexp" instead of "prefix". Where I would use "regexp<re>" where re is "^[eé]" or "^[a]" for instance. But it doesn''t work, as I get all the titles, and not only the one beginning with "e" or "é". See my code for use within "E" tiddler below:

\define glossy()
<$set name="initial" filter="[{!!title}lowercase[]]">
<$set name="others" value="é">
<$set name="pattern" value="^[<<initial>><<others>>]">
filter <<filter>>
<ul>
<$list filter="[tag[glossaire]regexp<pattern>] +[sortan[]]"><li><$link/></li></$list>
</ul>
</$set></$set></$set>
\end

<<glossy>>

with the control of "others", I'll be able to achieve my goal. But I have difficulty with regexp (but not with regular expressions per se) which I shall address in another topic.

Jean-Pierre Rivière

unread,
Oct 22, 2020, 5:50:26 PM10/22/20
to TiddlyWiki
I have not been able to achieve what I wanted in this case with subfilter, but I've been successul with regexp. So I post it here.

\define glossaryLetter()
<$set name="initial" filter="[{!!title}lowercase[]]">
<$set name="others" filter="[<initial>compare:string:eq[e]then[é]]">
<$wikify name="pattern" text="""(?i)^([(]([^)]+[)] )?)?[<$macrocall $name="initial"/><$macrocall $name="others"/>]""" output="text">
<ul>
<$list filter="[tag[glossaire]regexp<pattern>]"><li><$link/></li></$list>
</ul>
</$wikify></$set></$set>
\end

used in a tag name "E" or 3B" for instance. I finally decided to hard-code the "e" case. It's simpler and yet I have retain what I would get if I used a dictionary so that the rest of the code would not be affected if I change my mind. Note that with regular expression I can now handle entry like "(really good) song for folk guitar" at both r or s (my choice to have it at both and not only at s) but this one is not sorted accordingly (would require a sorting function, not sure I can do it without js and it only concern one tiddler so far).

I would really appreciate a solution with subfilter.

Xavier Cazin

unread,
Oct 24, 2020, 2:58:18 AM10/24/20
to tiddl...@googlegroups.com
Hi Jean-Pierre,

If you don't mind using the TiddlyWiki prerelease, I suggest the brand new subsort filter operator as well as the newly parametrised trim operator:

\define glossaryLetter()
<ul>
<$vars initial={{{ [<currentTiddler>lowercase[]] }}}>
<$vars initial_regexp={{{ [<initial>compare:string:eq[e]] +[then[(e|é)]else<initial>addprefix[^]] }}}>
<$vars tail_filter="[trim:prefix[e]trim:prefix[é]]">
<$list filter="[tag[glossaire]regexp<initial_regexp>] +[sortsub<tail_filter>]">
<li><$link/></li>
</$list>
</$vars>
</$vars>
</$vars>
</ul>
\end

Cheers,
-- Xavier


Jean-Pierre Rivière

unread,
Oct 26, 2020, 12:44:11 PM10/26/20
to TiddlyWiki
£Hi!

Thank you, this one is functionnal. BTW, I was already in 5.1.23-prerelease.

But how can I get the doc form this new trim operator?

Mark S.

unread,
Oct 26, 2020, 1:36:02 PM10/26/20
to TiddlyWiki
You can't insert a widget into the middle of a filter. But it doesn't matter, you don't need it:

<$set name="initial" filter="[{!!title}lowercase[]]">
<$list filter="[tag[glossaire]prefix<initial>!prefix[é]] [[tag[glossaire]prefix[é)]]+[sortan[]]">

</$list>
</$set>

In the first part of the filter I exclude é. In the second run, I ONLY include é. 

Xavier Cazin

unread,
Oct 27, 2020, 10:52:17 AM10/27/20
to tiddl...@googlegroups.com
Duh, sortan[] !!!

Thanks for the reminder, Mark😌

-- Xavier.


--
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+...@googlegroups.com.

Jean-Pierre Rivière

unread,
Oct 27, 2020, 8:08:34 PM10/27/20
to TiddlyWiki
I don't ee the point of prefix[e]!prefix[é] because é won't be incorporated by prefix[e].

Also, the second run is not working because of two glitches: 1) [[ instead of [ at the beginning and [é) instead of [é].

Thanks again.
Reply all
Reply to author
Forward
0 new messages