summaryrefslogtreecommitdiff
path: root/tex/context/base/sort-ini.tex
blob: 86f3091c0e551e5e61e00932a7b6b25cc441d563 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
%D \module
%D   [       file=sort-ini,
%D        version=2005.08.08,
%D          title=\CONTEXT\ Sort Macros,
%D       subtitle=Initialization,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

% dodo: 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.

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

\writestatus{loading}{Context Sorting Macros (ini)}

%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

\let\currentexportclass\empty

\def\exportsortaction#1#2#3%
  {\convertargument#2\to\asciia
   \convertargument#3\to\asciib
   \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}

% Next we overload some macros defined in enco-ini and core-uti. This
% will change.

\let\definesortkey\gobblefourarguments

\def\savesortkeys
  {\globallet\savesortkeys\relax
   \enablemode[sortorder-\currentmainlanguage]%
   \bgroup
     \doifelse \currentregime {utf}
        {\exportutfsortexpansion{0}{128}{255}%
         \exportutfsortexpansion{1}{0}{255}}
       {\def\defineactivecharacter##1 ##2%
          {\expanded{\exportsortshortcut{\rawcharacter{##1}}}{##2}}%
        \doifelse{\characterregime}\nocharacterregime
          {\doifnot{\characterencoding}\nocharacterencoding % to be sure, autoregime
             {\the\executeifdefined{\@reg@\characterencoding}\emptytoks}}%
          {\the\executeifdefined{\@reg@\characterregime}\emptytoks}}%
   \egroup
   \readfile{\f!sortprefix new}\donothing\donothing % temporary hacks
   \readfile{\f!sortprefix def}\donothing\donothing % defaults
   \readfile{\f!sortprefix lan}\donothing\donothing}% language specifics

% already done \prependtoks \savesortkeys \to \everystarttext

\protect \endinput