%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 / 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.

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

% \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.

\startmessages  dutch  library: filters
  title: filter
      1: filter -- wordt geladen
      2: onbekend filter --
\stopmessages

\startmessages  english  library: filters
  title: filter
      1: filter -- is loaded
      2: unknown filter --
\stopmessages

\startmessages  german  library: filters
  title: filter
      1: filter -- is loaded
      2: unknown filter --
\stopmessages

\startmessages  czech  library: filters
  title: filter
      1: filter -- is loaded
      2: unknown filter --
\stopmessages

\startmessages  italian  library: filters
  title: filtri
      1: filtro -- caricato
      2: filtro sconosciuto --
\stopmessages

%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}}

%D \macros
%D   {usefiltersequence}
%D

\def\magicocpnumber{1}

% \def\dodousefiltersequence#1%
%   {\expandafter\ocp\csname\??or:#1\endcsname=\truefiltername{#1}\relax
%    \@EA \appendtoks
%      \@EA \addbeforeocplist \@EA \magicocpnumber \csname\??or:#1\endcsname
%    \to \scratchtoks}

% 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]%
  {\edef\currentfiltersequence{\getvalue{\??ot#1}}%
   \scratchtoks\emptytoks
   \processcommacommand[\currentfiltersequence]\dodousefiltersequence
   % \showthe\scratchtoks
   \expanded{\ocplist\csname\??ot:#1\endcsname=\the\scratchtoks}\nullocplist
   \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[\f!filterprefix#1]%
      \startreadingfile
      \readsysfile\shortfilename
        {\showmessage\m!filters1{#1}}
        {\showmessage\m!filters2{#1}}%
      \stopreadingfile}}

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

\protect \endinput
