%D \module
%D   [       file=strc-swd,
%D        version=2007.08.14,
%D          title=\CONTEXT\ Structure Macros,
%D       subtitle=Section Worlds,
%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 This is a prelude to a rewrite of sectioning.

% options : before after setups page text number label bookmark
% dodo    : listtext
%
% \startsectionworld[chapter][text={Test}]
% \stopsectionworld

\writestatus{loading}{ConTeXt Structure Macros / Sectionworlds}

\unprotect

\ifx\pushvalue\undefined

    \def\pushvalue#1{\expandafter\pushmacro\csname#1\endcsname}
    \def\popvalue #1{\expandafter\popmacro \csname#1\endcsname}

\fi

% brrr

\def\csnameexpanded#1#2%
  {\@EA\@EA\@EA\@EA\@EA\@EA\@EA#1\@EA\@EA\@EA\@EA\@EA\@EA\@EA#2\@EA\@EA\@EA\@EA\@EA\@EA\@EA}

\def\csnameexpandedoneargument#1#2%
  {\csnameexpanded\def\csexpandeda{#2}%
   \@EA#1\@EA{\csexpandeda}}

\def\csnameexpandedtwoarguments#1#2#3%
  {\csnameexpanded\def\csexpandeda{#2}%
   \csnameexpanded\def\csexpandedb{#3}%
   \@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA\csexpandeda\@EA}\@EA{\csexpandedb}}

\def\csnameexpandedthreearguments#1#2#3#4%
  {\csnameexpanded\def\csexpandeda{#2}%
   \csnameexpanded\def\csexpandedb{#3}%
   \csnameexpanded\def\csexpandedc{#4}%
   \@EA\@EA\@EA\@EA\@EA\@EA\@EA#1\@EA\@EA\@EA\@EA\@EA\@EA\@EA{\@EA\@EA\@EA\csexpandeda\@EA\@EA\@EA}\@EA\@EA\@EA{\@EA\csexpandedb\@EA}\@EA{\csexpandedc}}

% \def\xx{XX}\setvalue{xx:yy}{abc \xx def}\def\param#1{\csname xx:#1\endcsname}
% \def\testa    #1{\defconvertedargument\ascii{#1}{\tttf\ascii}}
% \def\testb  #1#2{\defconvertedargument\ascii{#1 #2}{\tttf\ascii}}
% \def\testc#1#2#3{\defconvertedargument\ascii{#1 #2 #3}{\tttf\ascii}}
% \noindent 1 \csnameexpandedoneargument   \testa{\param{yy}}
% \noindent 2 \csnameexpandedtwoarguments  \testb{\param{yy}}{\param{yy}}
% \noindent 3 \csnameexpandedthreearguments\testc{\param{yy}}{\param{yy}}{\param{yy}}

% rewrite the sectioning to use the variables, a bit tricky because then
% we need a special expansion trick

\def\sectionworldparameter    #1{\csname\??sw\currentsectionworldname#1\endcsname}
\def\pushsectionworldparameter#1{\expandafter\pushmacro\csname\??sw\currentsectionworldname#1\endcsname}
\def\popsectionworldparameter #1{\expandafter\popmacro \csname\??sw\currentsectionworldname#1\endcsname}

\def\setupsectionworld
  {\dodoubleargument\dosetupsectionworld}

\def\dosetupsectionworld[#1][#2]%
  {\getparameters[\??sw#1][#2]} % maybe some extra things

\def\dochecksectionworld#1%
  {\ifcsname\??sw\currentsectionworldname\endcsname\else
     \getparameters
       [\??sw\currentsectionworldname]
       [\c!before=,
        \c!after=,
        \c!setups=,
        \c!page=]%
   \fi}

\def\startsectionworld
  {\dodoubleargument\dostartsectionworld}

\def\dostartsectionworld[#1][#2]%
  {\pushmacro\currentsectionworldname
   \def\currentsectionworldname{#1}%
   \dochecksectionworld\currentsectionworldname
   \pushsectionworldparameter\c!before
   \pushsectionworldparameter\c!after
   \pushsectionworldparameter\c!setups
   \getparameters
     [\??sw\currentsectionworldname]
     [\c!text=,\c!number=\finalsectionnumber,\c!label=,\c!bookmark=,#2]%
   \doifsomething{\sectionworldparameter\c!page}
     {\setsectieenkoppeling\currentsectionworldname
     %\handlepagebreak\currentsectionworldname
      \checknexthead\handlepagebreak\currentsectionworldname}%
   \sectionworldparameter\c!before
   \begingroup
   \doifsomething{\sectionworldparameter\c!page}
     {\settrue\ignorehandlepagebreak}%
   \doifsomething{\sectionworldparameter\c!setups}
     {\setups[\sectionworldparameter\c!setups]}%
   \csnameexpandedthreearguments \doconstructheadwithvars
     {\sectionworldparameter\c!label }%
     {\sectionworldparameter\c!number}%
     {\sectionworldparameter\c!text  }%
   \doifsomething{\sectionworldparameter\c!bookmark}
     {\expanded{\bookmark[\sectionworldparameter\c!bookmark]}}%
   \ignorespaces} % for inline heads

\def\doconstructheadwithvars#1%#2#3%
  {\dodododoconstructhead\currentsectionworldname[#1]}% {#2}{#3}}

\def\stopsectionworld
  {\endgraf
   \endgroup
   \sectionworldparameter\c!after
   \popsectionworldparameter\c!setups
   \popsectionworldparameter\c!after
   \popsectionworldparameter\c!before
   \popmacro\currentsectionworldname}

\protect \endinput
