sort-ini.mkii / last modification: 2020-01-30 14:15
%D \module
%D   [       file=sort-ini,
%D        version=2005.08.08,
%D          title=\CONTEXT\ Sorting Macros,
%D       subtitle=Initialization,
%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.

% todo: autokeyexpansion => igv utf: \setupregister[index][keyexpansion=yes]

%D This module replaces existing sort key handling and is meant to be
%D used with the new texutil functionality. This module defines a few
%D auxiliary macros.

\writestatus{loading}{ConTeXt Sorting Macros / Initialization}

%D This module replaces existing sort key handling and is meant to be
%D used with the new texutil functionality. This module defines a few
%D auxiliary macros.

\ifx\exportsortaction\undefined \else \endinput \fi

%D The sorting method is largely bases on the one used in the old version
%D of texutil but i've changed the interface a bit. It all boils down to
%D a bunch of substitutions. The reimplementation makes it easier to extend
%D the rules. Currently we have multipass substitution and onepass sorting,
%D but we may change this some day. Since there is a plugin mechanism, using
%D an external sorter is also possible.

% test file:
%
% \mainlanguage[sl] \readfile{sort-ini}{}{}
%
% \starttext
%     test \index {aa1}  test \index {ab1}         test \index {aa2}
%     test \index {ab2}  test \index {aa10}        test \index {aa8}
%     test \index {aa9}  test \index {aa11}        test \index {aa10}
%     test \index {cccc} test \index {\ccaron ccc} test \index {\cacute ccc}
%     test \index {caaa} test \index {\ccaron aaa} test \index {\cacute aaa}
%     \placeindex
% \stoptext

% definitions:
%
% \exportsortshortcut{\\\'\\i}{iacute}
% \exportsortshortcut{\\\'i}  {iacute}
% \exportsortshortcut{\\\"e}  {ediaeresis}
% \exportsortshortcut{\\\'o}  {oacute}
%
% \exportsortexpansion{aeligature}{ae}
% \exportsortexpansion{ijligature}{y}
% \exportsortexpansion{oacute}    {oz}
% \exportsortexpansion{eacute}    {ezzz} % or e3
% \exportsortexpansion{egrave}    {ezz}  % or e2
% \exportsortexpansion{ediaeresis}{ez}   % or e1
% \exportsortexpansion{adiaeresis}{az}
% \exportsortreduction{ch}        {c}
% \exportsortreduction{ij}        {y}
%
% \exportsortexpansion{ccaron}  {cz}
% \exportsortexpansion{cacute}  {czz}
% \exportsortexpansion{dstroke} {dz}
% \exportsortexpansion{scaron}  {sz}
% \exportsortexpansion{zcaron}  {zz}
%
% \exportsortreduction{ch}{c}
% \exportsortreduction{ij}{y}
%
% \exportsortexpansion {ccaron} {c+1}
% \exportsortdivision  {c+1} {ccaron}
%           ==
% \exportsortrule {ccaron} {c+1}

\unprotect

\def\savesortkeys
  {\ifproductionrun
     \the\everysavesortkeys
     \global\everysavesortkeys\emptytoks
   \fi}

\appendtoks \savesortkeys \to \everyshipout

\let\currentexportclass\empty

\def\exportsortaction#1#2#3%
  {\defconvertedargument\asciia{#2}%
   \defconvertedargument\asciib{#3}%
   \immediatewriteutility{x #1 {\currentexportclass} {\asciia} {\asciib}}}

\def\exportsortshortcut {\exportsortaction s}
\def\exportsortexpansion{\exportsortaction e}
\def\exportsortreduction{\exportsortaction r}
\def\exportsortdivision {\exportsortaction d}

\def\exportsortrule#1#2%
  {\exportsortexpansion{#1}{#2}%
   \exportsortdivision {#2}{#1}}

\def\exportutfsortexpansion#1#2#3%
  {\bgroup
   \edef\utfsorta{\string\unknownchar}%
   \dostepwiserecurse{#2}{#3}\plusone
     {\edef\utfsortb{\@EA\string\csname\doutfunihash{#1}{\recurselevel}\endcsname}%
      \ifx\utfsortb\utfsorta \else
        \edef\utfsortc{\numbertoutf{\numexpr#1*256+\recurselevel\relax}}%
        \expanded{\exportsortshortcut{\utfsortc}{\utfsortb\space}}% space is really needed
      \fi}%
   \egroup}

\def\savesortdefinitions
  {\bgroup
     \doifelse \currentregime {utf}
        {\exportutfsortexpansion{0}{128}{255}%
         \exportutfsortexpansion{1}{0}{255}}
       {\def\defineactivecharacter##1 ##2% mkii code !
          {\doifnumberelse{##1}
              {\expanded{\exportsortshortcut{\rawcharacter{##1}}}{##2}}%
              {\expanded{\exportsortshortcut{\rawcharacter{\number`##1}}}{##2}}}%
        \doifelsenothing\currentregime
          {\doifnot\characterencoding\nocharacterencoding % to be sure, autoregime
             {\dowalkregime\characterencoding}}%
          {\dowalkregime\characterencoding}}%
   \egroup
   \startnointerference
   \setcatcodetable\ctxcatcodes
   \readsysfile{\f!sortprefix def.mkii}\donothing\donothing % default
   \stopnointerference
   \global\let\savesortdefinitions\relax}

\def\savesortlanguage#1% language specifics
  {\doifsomething{#1}
     {\doifundefined{\f!sortprefix::#1}%
        {\startnointerference
         \global\letvalue{\f!sortprefix::#1}\empty
         \def\currentexportclass{#1}%
         \enablemode[sortorder-#1]%
         \setcatcodetable\ctxcatcodes
         \readsysfile{\f!sortprefix lan.mkii}\donothing\donothing
         \stopnointerference}}}

\prependtoks
    \savesortdefinitions
\to \everysavesortkeys

% \defineregister[one]
% \defineregister[two] \setupregister[two][language=cz]
%
% \starttext
%   test \one{one} test \one{two} test \one {\aacute} test \one{alpha} test \one{chow}
%   test \two{one} test \two{two} test \two {\aacute} test \two{alpha} test \two{chow}
%   \blank[3*big] \placeregister[one]
%   \blank[3*big] \placeregister[two]
% \stoptext

\protect \endinput