filt-ini.mkii / last modification: 2020-01-30 14:15
%D \module
%D   [       file=filt-ini,
%D        version=2000.09.19,
%D          title=\CONTEXT\ Filter 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.

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

% \ifx\OmegaVersion\undefined

%            \let\definefiltersynonym  \gobbledoubleempty
%            \let\definefiltersequence \gobbledoubleempty
% \unexpanded\def\usefiltersequence   {\gobblesingleempty}
%            \let\usefilter            \gobblesingleempty
%            \let\truefiltername       \gobbleoneargument

%   \expandafter \endinput
% \fi

\unprotect

%D The real work starts here.

% We need the {\??ot::#1} check because otherwise aleph will crash. Taco's
% torture test:
%
% \ocp\ArabicContext = contextual
%
% \dorecurse {5000} {
%     \message{[\recurselevel]}
%     \ocplist\Arabic=\addbeforeocplist 1 \ArabicContext \nullocplist
% }

%D \macros
%D   {definefiltersynonym}

\def\definefiltersynonym
  {\dodoubleargument\dodefinefiltersynonym}

\def\dodefinefiltersynonym[#1][#2]%
  {\setvalue{\??or#1}{#2}}

%D \macros
%D   {truefiltername}

\def\truefiltername#1%
  {\ifundefined{\??or#1}#1\else\truefiltername{\getvalue{\??or#1}}\fi}

%D \macros
%D   {definefiltersequence}

\def\definefiltersequence
  {\dodoubleargument\dodefinefiltersequence}

% \def\dodefinefiltersequence[#1][#2]%
%   {\setvalue{\??ot#1}{#2}}

\def\dodefinefiltersequence[#1][#2]%
  {\setxvalue{\??ot#1}{#2}%
   \letgvalue{\??ot::#1}\v!stop}

%D \macros
%D   {usefiltersequence}
%D

\def\magicocpnumber{1}

% one can do:
%
%  \definefiltersequence
%    [farsi]
%    [utf8 to unicode16=>5,
%     persian fix,
%     arabic analysis=>3,
%     arabic glyphs]
%
% so, => is used to signal a priority

\def\dodousefiltersequence#1%
  {\expandafter\ocp\csname\??or:#1\endcsname=\truefiltername{#1}\relax
   \splitstring#1\at=>\to\!!stringa\and\!!stringb
   \edef\!!stringb{\number\ifx\!!stringb\empty\magicocpnumber\else\!!stringb\fi}%
   \appendetoks
     \noexpand\addbeforeocplist
     \!!stringb\space
     \expandafter\noexpand\csname\??or:\!!stringa\endcsname
   \to \scratchtoks}

\unexpanded\def\usefiltersequence[#1]%
  {\doifdefined{\??ot::#1}%
     {\doifvalue{\??ot::#1}\v!stop
         {\scratchtoks\emptytoks
          \expanded{\processcommalist[\getvalue{\??ot#1}]}\dodousefiltersequence
          \expanded{\global\ocplist\csname\??ot:#1\endcsname=\the\scratchtoks}\nullocplist
          \letgvalue{\??ot::#1}\v!start}%
       \expanded{\pushocplist\csname\??ot:#1\endcsname}\relax}}

%D \macros
%D   {usefilter}

\def\dousefilter#1%
  {\doifundefined{\c!file\f!filterprefix#1}%
     {\letvalue{\c!file\f!filterprefix#1}\empty
      \makeshortfilename[\truefilename{\f!filterprefix#1}]%
      \startreadingfile
        \readsysfile{\shortfilename.mkii}
          {\showmessage\m!filters1{#1}}
          {\showmessage\m!filters2{#1}}%
      \stopreadingfile}}

\def\usefilter[#1]%
  {\processcommalist[#1]\dousefilter}

\protect \endinput