%D \module
%D   [       file=x-corres,
%D        version=2003.12.15, % replaces keep-02a cum suis
%D          title=\CONTEXT\ XML Modules,
%D       subtitle=Handling Correspondence Base,
%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.

%D The selection spec:

\setvariables
  [contacts]
  [selection=,
   file=x-corres.xml] % fall back

%D First we define the group expansion pass:

\startsetups[contacts:collect]

  \defineXMLprocess  [contacts]

  \defineXMLignore   [contact]

  \defineXMLargument [contactfile]
    \processfile

  \defineXMLenvironmentsave [contactgroup] [label=]
    {\startXMLmappinggroup[contacts]}
    {\XMLaddcontactgrouptoselection
     \stopXMLmappinggroup}

\stopsetups

%D Next we define the main processing pass:

\startsetups[contacts:process]

  \defineXMLprocess[contacts]

  \defineXMLignore [contactgroup]

  \defineXMLargument [contactfile]
    \processfile

  \defineXMLenvironmentsave[contact] [label=]
    {\startXMLmappinggroup[contacts]}
    {\XMLselectcontact
     \stopXMLmappinggroup}

\stopsetups

\startXMLmapping[contacts]

  \defineXMLsave [initials]
  \defineXMLsave [formalname]
  \defineXMLsave [informalname]
  \defineXMLsave [title]
  \defineXMLsave [prefix]
  \defineXMLsave [suffix]
  \defineXMLsave [telephone]
  \defineXMLsave [mobiletelephone]
  \defineXMLsave [telefax]
  \defineXMLsave [email]
  \defineXMLsave [address]
  \defineXMLsave [information]

  \defineXMLenvironment [p] \endgraf \endgraf

  \defineXMLargument [member] \XMLaddcontacttoselection

\stopXMLmapping

%D The selection macros: we expand groups and replace them
%D by contact labels in the selection spec.

\def\XMLaddcontactgrouptoselection
  {\edef\XMLcontactlist{\getvariable{contacts}{selection}}%
   \edef\XMLgrouplabel {\XMLop{label}}%
   \expanded{\doifinset{\XMLgrouplabel}{\XMLcontactlist}}
     {\let\XMLgrouplist\empty
      \XMLflush{contactgroup}%
      \substituteincommalist\XMLgrouplabel\XMLgrouplist\XMLcontactlist
      \expanded
        {\globalsetvariables
           [contacts]
           [selection={\XMLcontactlist}]}}}

\def\XMLaddcontacttoselection#1%
  {\addtocommalist{#1}\XMLgrouplist}

%D The main selector:

\def\XMLselectcontact
  {\edef\XMLcontactlist {\getvariable{contacts}{selection}}%
   \edef\XMLcontactlabel{\XMLop{label}}%
   \doifelsenothing{\XMLcontactlist}
     {\donetrue}
     {\expanded{\doifinsetelse{\XMLcontactlabel}{\XMLcontactlist}}
        {\donetrue}
        {\donefalse}}%
   \ifdone
     \XMLflush{contact}%
     \setups[contact:handle]%
   \fi}

%D The default:

\startsetups[contact:handle]

  \XMLflush{address}

\stopsetups

\setups[contacts:process]

%D Handy:

\def\XMLprocesscontacts
  {\dosingleempty\XMLprocesscontacts}

\def\XMLprocesscontacts[#1]%
  {\bgroup
   \doifelsenothing{#1}
     {\XMLprocesscontacts[\getvariable{contacts}{file}]}
     {\setups[contacts:collect]%
      \processcommacommand[#1]\processXMLfile
      \setups[contacts:process]%
      \processcommacommand[#1]\processXMLfile}%
   \egroup}

\endinput