%D \module
%D   [       file=strc-syn,
%D        version=2008.10.20,
%D          title=\CONTEXT\ Structure Macros,
%D       subtitle=Synonyms and Sorting,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\writestatus{loading}{ConTeXt Structure Macros / Synonyms and Sorting}

\registerctxluafile{strc-syn}{}

%D Although we could nowadays build this on top of regular lists we keep this
%D more efficient variant around. Eventually we can add some options to lists
%D that also provide such functionality but at the cost of much more overhead.
%D
%D We show a usage of both synonyms and sorts, which are deep down variants of
%D so called simple lists. A definition looks like this:
%D
%D \startbuffer
%D \definesynonyms
%D   [myabbreviation]
%D
%D \setupsynonyms
%D   [myabbreviation]
%D   [headstyle=bold,
%D    headcolor=darkred,
%D    synonymstyle=boldslanted,
%D    synonymcolor=darkblue,
%D    textstyle=slanted,
%D    textcolor=darkgreen,
%D    style=normal,
%D    color=darkyellow]
%D
%D \definesorting
%D   [mylogo]
%D
%D \setupsorting
%D   [mylogo]
%D   [style=bold,
%D    color=darkmagenta]
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D More complex definitions involves commands to call up meanings and such. The
%D use of the defined commands is as follows: \
%D
%D \startbuffer
%D \myabbreviation [FIRST]  {TheFirst}  {The First Words}
%D \myabbreviation [SECOND] {TheSecond} {The Second Words}
%D \myabbreviation [THIRD]  {TheThird}  {The Third Words}
%D
%D \mylogo [FOURTH] {TheFourth}
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D By default a synonym is just typeset and flagges as being used, so that in
%D a list it wil be shows with its meaning. You can however also expand the
%D meaning automatically at first use:
%D
%D \startbuffer
%D \setupsynonyms[myabbreviation][alternative=first]
%D
%D We have \FIRST, \SECOND\ and also \THIRD\ but no \FOURTH.
%D
%D We have \FIRST, \SECOND\ and also \THIRD\ but no \FOURTH.
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D We can change the order, as demonstrated in:
%D
%D \startbuffer
%D \resetshownsynonyms[myabbreviation]
%D
%D \setupsynonyms[myabbreviation][alternative=last]
%D
%D We have \FIRST\ and \THIRD\ or \FOURTH.
%D
%D We have \FIRST\ and \THIRD\ or \FOURTH.
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D A list is called up with:
%D
%D \startbuffer
%D \placelistofsynonyms[myabbreviation]
%D
%D \placelistofsorts[mylogo]
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D The lists are constructions (like descriptions are) and can be set up
%D likewise.

% todo: add 'define only' option to descriptions, then add sorting (also based on key)
% and call to definition -> replaces this module

\unprotect

% split but common in lua

\permanent\protected\def\preprocessexpansion#1#2#3#4% do this at the lua end if still needed
  {\ifx#1\s!xml
     \xmlstartraw
       \xdef#2{#4}%
     \xmlstopraw
     \glet#3\s!xml
   \else
     \ifx#1\v!yes
       \xdef#2{#4}%
     \else
       \xdef#2{\detokenize{#4}}%
     \fi
     \glet#3\s!tex
   \fi}

%D We now use a simple list variant:

\installcorenamespace {simplelist}

\installcommandhandler \??simplelist {simplelist} \??simplelist

\aliased\let\setupsimplelists\setupsimplelist

\setupsimplelists[%
    %c!title=,
    %c!text=,
    %
    %c!style=,
    %c!color=,
    %c!command=,
    %c!align=,
    %
    %c!headstyle=,
    %c!headcolor=,
    %c!headalign=,
    %
    %c!titlestyle=,
    %c!titlecolor=,
    %c!titlecommand=,
    %c!titleleft=,
    %c!titleright=,
    %
    %c!closesymbol=,
    %c!closecommand=,
    %
    \c!alternative=\v!left,
    \c!display=\v!yes,
    \c!width=7\emwidth,
    \c!distance=\emwidth,
    \c!titledistance=.5\emwidth,
    %c!hang=,
    %c!sample=,
    \c!margin=\v!no,
    \c!before=\startpacked,
    \c!inbetween=\blank,
    \c!after=\stoppacked,
    %c!indentnext=,
    %c!indenting=,
    %
    \c!expansion=\v!no,
    %c!xmlsetup=,
    %s!catcodes=,
    \s!language=\currentmainlanguage,
]

\appendtoks
    \setfalse\c_strc_constructions_define_commands
    \ifempty\currentsimplelistparent
        \defineconstruction[\currentsimplelist][\s!handler=\v!simplelist,\c!level=1]%
    \else
        \defineconstruction[\currentsimplelist][\currentsimplelistparent][\s!handler=\v!simplelist,\c!level=1]%
    \fi
    \settrue\c_strc_constructions_define_commands
\to \everydefinesimplelist

\protected\defcsname\??constructioninitializer\v!simplelist\endcsname
  {\let         \currentsimplelist               \currentconstruction
   \enforced\let\constructionparameter           \simplelistparameter
   \enforced\let\constructionnamespace           \??simplelist
   \enforced\let\detokenizedconstructionparameter\detokenizedsimplelistparameter
   \enforced\let\letconstructionparameter        \letsimplelistparameter
   \enforced\let\useconstructionstyleandcolor    \usesimpleliststyleandcolor
   \enforced\let\setupcurrentconstruction        \setupcurrentsimplelist}

\protected\defcsname\??constructionfinalizer\v!simplelist\endcsname
  {}

\protected\defcsname\??constructiontexthandler\v!simplelist\endcsname
  {\begingroup
   \useconstructionstyleandcolor\c!headstyle\c!headcolor
   \the\everyconstruction
   \constructionparameter\c!headcommand
     {\strut
      \currentsimplelistentry}%
   \endgroup}

% And we build on top of this.

\ifdefined\dotagsynonym \else \aliased\let\dotagsynonym\relax \fi
\ifdefined\dotagsorting \else \aliased\let\dotagsorting\relax \fi

\definesimplelist
  [\v!synonym]
  [\c!state=\v!start,
  %\c!synonymstyle=,
  %\c!textstyle=,
  %\c!headstyle=,
  %\c!headcolor=,
  %\c!criterium=,
   \c!location=\v!left,
   \c!width=5\emwidth,
   \c!distance=\zeropoint,
  %\c!sample=,
  %\c!hang=,
  %\c!align=,
  %\c!before=,
  %\c!inbetween=,
  %\c!after=,
   \c!indentnext=\v!no,
  %\c!expansion=,
   \c!method=]

\aliased\let\setupsynonyms\setupsimplelist

% these  might become private

\mutable\let\currentsynonymoption   \empty
\mutable\let\currentsynonymcoding   \empty
\mutable\let\currentsynonymexpansion\empty
\mutable\let\currentsynonym         \empty
\mutable\let\currentsynonymtag      \empty
\mutable\let\currentsynonymtext     \empty

\permanent\tolerant\protected\def\definesynonyms[#1]#*[#2]#*[#3]#*[#4]% name plural \meaning \use
  {\ifnum\lastarguments=\plusfour
     \protected\instance\def#4##1{\strc_synonyms_insert{#1}{##1}}% name tag
     \frozen\instance\protected\defcsname#1\endcsname{\definesynonym[\v!no][#1]}% \name
   \else
     \frozen\instance\protected\defcsname#1\endcsname{\definesynonym[\v!yes][#1]}% \name
   \fi
   \ifparameter#3\or
     \frozen\instance\protected\def#3##1{\strc_synonyms_insert_meaning{#1}{##1}}% \meaning
   \fi
   \edef\currentsynonym{#1}%
   %
  %\checksynonymparent
  %\setupcurrentsynonym[\s!single={#1},\s!multi={#2}]%
   \setfalse\c_strc_constructions_define_commands
   \definesimplelist
     [\currentsynonym]%
     [\v!sorting]
     [\s!single={#1},%
      \s!multi={#2}]%
   \settrue\c_strc_constructions_define_commands
   \ifparameter#2\or
     %
     \presetheadtext[#2=\Word{#2}]% changes the \if...argument
     %
     % These will go away. Actually the overloads catched this empty case!
     %
     \frozen\instance\protected\defcsname\e!setup #2\e!endsetup\endcsname{\setupsynonyms[#1]}% obsolete definition
     \frozen\instance\protected\defcsname\e!place   \e!listof#2\endcsname{\placelistofsynonyms[#1]}% accepts extra argument
     \frozen\instance\protected\defcsname\e!complete\e!listof#2\endcsname{\completelistofsynonyms[#1]}%
   \fi}

% \abbreviation[XXX][321]{321}{Three, Two, One} : optional sort key

\permanent\tolerant\protected\def\definesynonym[#1]#*[#2]#*[#3]#*[#4]% [yes][abbreviation][FOO]{foo}{foo me}
  {\begingroup
   \edef\currentsynonymoption{#1}%
   \edef\currentsynonym{#2}%
   \edef\currentsynonymtag{#3}%
   \edef\currentsynonymsortkey{#4}%
   \strc_synonyms_define_entry}

% \installcorenamespace {synonymentry}
%
% \installsetuponlycommandhandler \??synonymentry {synonymentry}
%
% \permanent\tolerant\protected\def\setsynonym[#1]#*[#2]%
%   {\begingroup
%    \setupsynonymentry[#2]%
%    \edef\currentsynonym       {#1}%
%    \edef\currentsynonymoption {\synonymentryparameter\c!option}%
%    \edef\currentsynonymtag    {\synonymentryparameter\c!tag}%
%    \edef\currentsynonymsortkey{\synonymentryparameter\c!sortkey}%
%    \strc_synonyms_define_entry{\synonymentryparameter\c!text}{\synonymentryparameter\c!meaning}}

\def\strc_synonyms_define_entry#1#2%
  {\let\currentsimplelist\currentsynonym
   \ifempty\currentsynonymtag
     \edef\currentsynonymtag{#1}%
   \fi
   \ifempty\currentsynonymtag \else
     % this is not that efficient, esp when we load a big list
     \edef\currentsynonymexpansion{\simplelistparameter\c!expansion}%
     \preprocessexpansion\currentsynonymexpansion\m_synonyms_text   \currentsynonymcoding{#1}%
     \preprocessexpansion\currentsynonymexpansion\m_synonyms_meaning\currentsynonymcoding{#2}%
     % currently they all end up in the tuc file
     \clf_registersynonym
        {\currentsynonym}%
        {synonym}%
        {%
            metadata {%
                catcodes \catcodetable
                coding   {\currentsynonymcoding}%
            \ifx\currentsynonymcoding\s!xml
                xmlroot  {\xmldocument}%
            \fi
            }%
            definition {%
                tag     {\currentsynonymtag}%
                sortkey {\currentsynonymsortkey}%
                synonym {\m_synonyms_text}%
                meaning {\m_synonyms_meaning}%
              % used    false
            }%
        }%
     \relax
     \ifx\currentsynonymoption\v!yes
       \instance\setuxvalue\currentsynonymtag{\strc_synonyms_insert{\currentsynonym}{\currentsynonymtag}}%
     \fi
   \fi
   \endgroup}

\permanent\tolerant\protected\def\registersynonym  [#1]#*[#2]{\clf_registerusedsynonym{#1}{#2}}
\permanent         \protected\def\currentsynonymname         {\clf_synonymname{\currentsimplelist}{\currentsynonymtag}}
\permanent         \protected\def\currentsynonymmeaning      {\clf_synonymmeaning{\currentsimplelist}{\currentsynonymtag}}
\permanent         \protected\def\doifelsecurrentsynonymused {\clf_doifelsesynonymused{\currentsimplelist}{\currentsynonymtag}}
\permanent         \protected\def\doifelsecurrentsynonymshown{\clf_doifelsesynonymshown{\currentsimplelist}{\currentsynonymtag}}
\permanent         \protected\def\resetusedsynonyms      [#1]{\clf_resetusedsynonyms{#1}}
\permanent         \protected\def\resetshownsynonyms     [#1]{\clf_resetshownsynonyms{#1}}

\aliased\let\rawsynonymname   \clf_synonymname
\aliased\let\rawsynonymmeaning\clf_synonymmeaning

\installcorenamespace{simplelistalternative} % specific ways of rendering a list
\installcorenamespace{simplelistrenderings}  % a namespace for setups (rather local)

\installcommandhandler \??simplelistalternative {simplelistalternative} \??simplelistalternative

\setupsimplelist
  [\v!synonym]
  [\c!alternative=\v!normal]

\protected\def\strc_synonyms_insert_meaning#1#2% name tag
  {\dontleavehmode % otherwise we don't get it right at the beginning of a par
   \begingroup
   \def\currentsimplelist{#1}%
   \def\currentsynonymtag{#2}%
   \fastsetup{\??simplelistrenderings::\v!text}%
   \endgroup}

\protected\def\strc_synonyms_insert#1#2% name tag
  {\dontleavehmode % otherwise we don't get it right at the beginning of a par
   \begingroup
   \edef\currentsimplelist{#1}%
   \let\currentsynonym\currentsimplelist % for a while
   \def\currentsynonymtag{#2}%
   \edef\currentsimplelistalternative{\simplelistparameter\c!alternative}%
   \doifnotcommandhandler\??simplelistalternative\currentsimplelistalternative
     {\let\currentsimplelistalternative\v!normal}%
   \fastsetup{\??simplelistrenderings:\v!synonym:\currentsimplelistalternative}%
   \normalexpanded{\endgroup\simplelistparameter\c!next}}

% \setupsimplelistalternative
%   [\c!command=\directsimplelistparameter\c!command]

\definesimplelistalternative
  [\v!normal]
  [\c!inbetween=\space,
   \c!left=(,
   \c!right=)]

\definesimplelistalternative
  [\v!first]
  [\v!normal]

\definesimplelistalternative
  [\v!last]
  [\v!normal]

\startsetups[\??simplelistrenderings::\v!synonym]
    \begingroup
    \dostarttaggedchained\t!synonym\currentsynonym\??simplelist
    \dotagsynonym
    \usesimpleliststyleandcolor\c!synonymstyle\c!synonymcolor
    \simplelistparameter\c!synonymcommand{\currentsynonymname}%
    \dostoptagged
    \endgroup
\stopsetups

\startsetups[\??simplelistrenderings::\v!text]
    \begingroup
    \usehyphensparameter\simplelistparameter
    \usesimpleliststyleandcolor\c!textstyle\c!textcolor
    \simplelistparameter\c!textcommand{\currentsynonymmeaning}%
    \endgroup
\stopsetups

\startsetups[\??simplelistrenderings:\v!synonym:\v!normal]
    \fastsetup{\??simplelistrenderings::\v!synonym}
\stopsetups

\startsetups[\??simplelistrenderings:\v!synonym:\v!first]
    \fastsetup{\??simplelistrenderings::\v!synonym}
    \doifelsecurrentsynonymshown \donothing {
        \simplelistalternativeparameter\c!inbetween
        \simplelistalternativeparameter\c!left
        \fastsetup{\??simplelistrenderings::\v!text}
        \simplelistalternativeparameter\c!right
    }
\stopsetups

\startsetups[\??simplelistrenderings:\v!synonym:\v!last]
    \doifelsecurrentsynonymshown {
        \fastsetup{\??simplelistrenderings::\v!synonym}
    } {
        \fastsetup{\??simplelistrenderings::\v!text}
        \simplelistalternativeparameter\c!inbetween
        \simplelistalternativeparameter\c!left
        \fastsetup{\??simplelistrenderings::\v!synonym}
        \simplelistalternativeparameter\c!right
    }
\stopsetups

\aliased\let\synonymentry\relax

\permanent\tolerant\protected\def\placelistofsynonyms[#1]#*[#2]%
  {\begingroup
   \edef\currentsimplelist{#1}%
   \doifelsecommandhandler\??simplelist\currentsimplelist
     {\strc_constructions_initialize{#1}%
      \setupcurrentsimplelist[#2]%
      \enforced\let\synonymentry\strc_synonym_normal
      % so we can hook tabulate into before and after
      \normalexpanded{\simplelistparameter\c!before
        \noexpand\clf_processsynonyms
           {#1}%
           {%
               criterium {\simplelistparameter\c!criterium}%
               language  {\simplelistparameter\s!language}%
               method    {\simplelistparameter\c!method}%
           }%
        \relax
      \simplelistparameter\c!after}%
      \relax}%
     {}% todo: message that invalid
   \endgroup}

\permanent\tolerant\protected\def\completelistofsynonyms[#1]#*[#2]%
  {\begingroup
   \edef\currentsimplelist{#1}%
   \doifelsecommandhandler\??simplelist\currentsimplelist
     {\normalexpanded{\startnamedsection[\v!chapter][\c!title={\headtext{\simplelistparameter\s!multi}},\c!reference=#1]}%
        \placelistofsynonyms[#1][#2]%
        \page
      \stopnamedsection}%
     {}% todo: message that invalid
   \endgroup}

\mutable\let\currentsimplelistentry\empty

\protected\def\strc_synonym_normal#1#2#3#4%
  {\begingroup
   \def\currentsimplelistentry{#3}%
   \csname\??constructionstarthandler\v!construction\endcsname
   #4%
   \csname\??constructionstophandler\v!construction\endcsname
   \endgroup}

%D Sorting (a simplified version of synonym).

\definesimplelist
  [\v!sorting]
  [\c!state=\v!start,
  %\c!command=, % we test for defined !
  %\c!criterium=,
  %\c!style=,
   \c!before=\startpacked,
   \c!after=\stoppacked,
  %\c!expansion=,
   \c!method=]

\aliased\let\setupsorting\setupsimplelist

% if #3=\relax or \v!none, then no command but still protected

% these  might become private

\mutable\let\currentsortingoption   \empty
\mutable\let\currentsortingcoding   \empty
\mutable\let\currentsortingexpansion\empty
\mutable\let\currentsorting         \empty
\mutable\let\currentsortingtag      \empty
\mutable\let\currentsortingtext     \empty

\permanent\tolerant\protected\def\definesorting[#1]#*[#2]#*[#3]%
  {\ifnum\lastarguments=\plusthree
     \doifnot{#3}\v!none
       {\ifx#3\relax \else
          \protected\instance\def#3##1{\strc_sorting_insert{#1}{##1}}%
        \fi}%
     \frozen\instance\protected\defcsname#1\endcsname{\definesort[\v!no][#1]}%
   \else
     \frozen\instance\protected\defcsname#1\endcsname{\definesort[\v!yes][#1]}%
   \fi
   \edef\currentsorting{#1}%
   \setfalse\c_strc_constructions_define_commands
   \definesimplelist
     [\currentsorting]%
     [\v!sorting]
     [\s!single={#1},%
      \s!multi={#2}]%
   \settrue\c_strc_constructions_define_commands
   \ifparameter#2\or
     %
     \presetheadtext[#2=\Word{#2}]% changes the \if...argument
     %
     % These will go away. Actually the overloads catched this empty case!
     %
     %
     \presetheadtext[#2=\Word{#2}]%
     %
     \frozen\instance\protected\defcsname\e!setup #2\e!endsetup\endcsname{\setupsorting[#1]}% obsolete definition
     \frozen\instance\protected\defcsname\e!place   \e!listof#2\endcsname{\placelistofsorts[#1]}%
     \frozen\instance\protected\defcsname\e!complete\e!listof#2\endcsname{\completelistofsorts[#1]}%
   \fi}

\permanent\tolerant\protected\def\definesort[#1]#*[#2]#*[#3]%
  {\begingroup
   \edef\currentsortingoption{#1}%
   \edef\currentsorting{#2}%
   \edef\currentsortingtag{#3}%
   \strc_sorting_define_entry}

\def\strc_sorting_define_entry#1%
  {\let\currentsimplelist\currentsimplelist
   \ifempty\currentsortingtag
     \edef\currentsortingtag{#1}%
   \fi
   \ifempty\currentsortingtag \else
     \edef\currentsortingexpansion{\simplelistparameter\c!expansion}%
     \preprocessexpansion\currentsortingexpansion\currentsortingtext\currentsortingcoding{#1}%
     \clf_registersynonym
        {\currentsorting}%
        {sorting}%
        {%
            metadata {%
                catcodes \catcodetable
                coding   {\currentsortingcoding}%
            \ifx\currentsortingcoding\s!xml
                xmlroot  {\xmldocument}%
            \fi
            }%
            definition {%
                tag     {\currentsortingtag}%
                synonym {\currentsortingtext}%
              % used    false
            }%
        }%
     \relax
     \ifx\currentsortingoption\v!yes
       \instance\setuxvalue\currentsortingtag{\strc_sorting_insert{\currentsorting}{\currentsortingtag}}%
     \fi
   \fi
   \endgroup}

\permanent\protected\def\currentsortingname         {\clf_synonymname         {\currentsimplelist}{\currentsortingtag}}
\permanent\protected\def\doifelsecurrentsortingused {\clf_doifelsesynonymused {\currentsimplelist}{\currentsortingtag}}
\permanent\protected\def\resetusedsortings      [#1]{\clf_resetusedsynonyms   {#1}}

\setupsimplelist
  [\v!sorting]
  [\c!alternative=\v!normal]

\protected\def\strc_sorting_insert#1#2% name tag
  {\dontleavehmode % otherwise we don't get it right at the beginning of a par
   \begingroup
   % no kap currently, of .. we need to map cap onto WORD
   \edef\currentsorting{#1}%
   \edef\currentsortingtag{#2}%
   \let\currentsimplelist\currentsorting
   \edef\currentsimplelistalternative{\simplelistparameter\c!alternative}%
   \doifnotcommandhandler\??simplelistalternative\currentsimplelistalternative
     {\let\currentsimplelistalternative\v!normal}%
   \fastsetup{\??simplelistrenderings:\v!sorting:\currentsimplelistalternative}%
   \normalexpanded{\endgroup\simplelistparameter\c!next}}

% or:
%
% \doifelsesetups{\??simplelistrenderings:\v!sorting:\currentsimplelistalternative}
%    {\fastsetup{\??simplelistrenderings:\v!sorting:\currentsimplelistalternative}}
%    {\fastsetup{\??simplelistrenderings:\v!sorting:\v!normal}}

\startsetups [\??simplelistrenderings:\v!sorting:\v!normal]
   \fastsetup{\??simplelistrenderings::\v!sorting}%
\stopsetups

\startsetups [\??simplelistrenderings::\v!sorting]
    \begingroup
    \dostarttaggedchained\t!sorting\currentsorting\??simplelist
    \dotagsorting
    \usesimpleliststyleandcolor\c!style\c!color
    \currentsortingname
    \dostoptagged
    \endgroup
\stopsetups

\permanent\tolerant\protected\def\registersort[#1]#*[#2]%
  {\clf_registerusedsynonym{#1}{#2}}

% before after
%
% maybe just 'commandset' and then combine

\permanent\tolerant\protected\def\placelistofsorts[#1]#*[#2]%
  {\begingroup
   \edef\currentsimplelist{#1}%
   \strc_constructions_initialize{#1}%
   \setupcurrentsimplelist[#2]%
   \edef\p_simplelist_command{\simplelistparameter\c!command}%
   \ifempty\p_simplelist_command
     \enforced\let\synonymentry\strc_sorting_normal
   \else
     \enforced\let\synonymentry\strc_sorting_command
   \fi
   % so we can hook tabulate into before and after
   \normalexpanded{\simplelistparameter\c!before
     \noexpand\clf_processsynonyms
        {#1}%
        {%
            criterium {\simplelistparameter\c!criterium}%
            language  {\simplelistparameter\s!language}%
            method    {\simplelistparameter\c!method}%
        }%
     \relax
   \simplelistparameter\c!after}%
   \endgroup}

\permanent\tolerant\protected\def\completelistofsorts[#1]#*[#2]%
  {\begingroup
   \edef\currentsimplelist{#1}%
   \normalexpanded{\startnamedsection[\v!chapter][\c!title={\headtext{\simplelistparameter\s!multi}},\c!reference=#1]}%
   \placelistofsorts[#1][#2]%
   \page
   \stopnamedsection
   \endgroup}

\def\strc_sorting_command#1#2#3#4% #4 is meaning but empty here
  {\p_simplelist_command{#1}{#2}{#3}}

\def\strc_sorting_normal#1#2#3#4% #4 is meaning but empty here
  {\begingroup
   \usesimpleliststyleandcolor\c!style\c!color
   #3%
   \endgroup
   \par}

%D Presets.

% To be considered:
%
% \setupsimplelist
%   [\v!sorting]
%   [\c!headstyle=\simplelistparameter\c!synonymstyle,
%    \c!headcolor=\simplelistparameter\c!synonymcolor,
%    \c!style=\simplelistparameter\c!textstyle,
%    \c!color=\simplelistparameter\c!textcolor]

\definesynonyms
  [\v!abbreviation]
  [\v!abbreviations]
  [\infull]

\setupsynonyms
  [\v!abbreviation]
  [\c!hyphens=\v!no, % new, not yet in setup definitions
   \c!textstyle=\v!capital]

\definesorting
  [\v!logo]
  [\v!logos]
% [\logogram] % no

\protect \endinput
