%D \module
%D   [       file=page-ins,
%D        version=2002.04.16, % was core-ins
%D          title=\CONTEXT\ Insertion Macros,
%D       subtitle=Insertions,
%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 Core Macros / Insertions}

%D Insertions are special data collections that are associated to \TEX's internal
%D page builder. When multiple footnote classes were introduced, I decided to
%D isolate some of the functionality in a module.

\registerctxluafile{page-ins}{}

\unprotect

%D Because we need to deal with inserts at the \LUA\ end as well,
%D we provide a proper installer.

% Not yet used as we need to adapt some code to this.

\installcorenamespace{insertion}
\installcorenamespace{insertionnumber}

\installcommandhandler \??insertion {insertion} \??insertion

\setupinsertion
  [%c!n=\plusone,
   %c!distance=\zeropoint,
   %c!maxheight=\maxdimen,
   %c!factor=\plusthousand,
   \c!location=\v!page]

\newconstant\insertionmigrationmode

\def\page_inserts_check_anchoring
  {\edef\p_anchoring{\namedinsertionparameter\empty\c!anchoring}%
   \insertionmigrationmode\ifx\p_anchoring\v!auto\plusone\else\zerocount\fi
   \clf_setinsertmigration{\p_anchoring}}

\appendtoks
    \ifx\currentinsertionparent\empty
        \page_inserts_check_anchoring
    \fi
\to \everysetupinsertion

\setupinsertion
  [\c!anchoring=\v!none]

\appendtoks
    \page_inserts_check_anchoring
\to \everystarttext % or \everyjob

\newcount\currentinsertionnumber % This is a count and not a macro !

\newtoks\t_page_inserts_list

\let\doprocessinsert\relax

%D Maybe some day we will move settings here.

\unexpanded\def\setcurrentinsertion#1%
  {\edef\currentinsertion{#1}%
   \currentinsertionnumber\csname\??insertionnumber\currentinsertion\endcsname}

\def\namedinsertionnumber#1{\csname\??insertionnumber#1\endcsname}

\unexpanded\def\page_inserts_synchronize_registers
  {\currentinsertionnumber\csname\??insertionnumber\currentinsertion\endcsname}

% for practical reasons we still set these elsewhere but that might change in the future
%
% \global\count\currentinsertionnumber\numexpr\insertionparameter\c!factor/\insertionparameter\c!n\relax
% \global\skip \currentinsertionnumber\insertionparameter\c!distance \relax
% \global\dimen\currentinsertionnumber\insertionparameter\c!maxheight\relax}
% \floatingpenalty\zerocount

\appendtoks
    \ifx\currentinsertionparent\empty \else
        \page_inserts_synchronize_registers
    \fi
\to \everysetupinsertion

\unexpanded\def\page_inserts_process#1% beware, this adapts currentinsertion !
  {\edef\currentinsertion{#1}%
   \currentinsertionnumber\csname\??insertionnumber\currentinsertion\endcsname
   \doprocessinsert\currentinsertionnumber} % old method

\unexpanded\def\processinsertions
  {\the\t_page_inserts_list}

\unexpanded\def\synchronizeinsertions
  {\let\doprocessinsert\page_inserts_synchronize
   \processinsertions}

\unexpanded\def\page_inserts_synchronize#1% yes or no
  {\ifvoid#1\else
     \insert#1{\unvbox#1}%
   \fi}

\unexpanded\def\doifelseinsertion#1%
  {\ifcsname\??insertionnumber#1\endcsname
     \expandafter\firstoftwoarguments
   \else
     \expandafter\secondoftwoarguments
   \fi}

\let\doifinsertionelse\doifelseinsertion

% \unexpanded\def\startinsertion[#1]%
%   {\insert\csname\??insertionnumber#1\endcsname\bgroup}
%
% \unexpanded\def\stopinsertion
%   {\egroup}

% For the moment we use the regular insertion allocator so that users can
% still define their own insertions (not that they will play nicely with
% all context mechanisms then). We can use the dimensions at the \LUA\ end
% so we don't need to pass pass them explicitly. Actually, when we see an
% insertion node at that end, we already know the number.

\appendtoks
    \ifx\currentinsertionparent\empty
        \ifcsname\??insertionnumber\currentinsertion\endcsname
          % bad news
        \else
          \expandafter\newinsert\csname\??insertionnumber\currentinsertion\endcsname
          \page_inserts_synchronize_registers
          \clf_defineinsertion
            {\currentinsertion}%
            {%
                number \currentinsertionnumber
            }%
          \relax
          \t_page_inserts_list\expandafter\expandafter\expandafter
            {\expandafter\the\expandafter\t_page_inserts_list
             \expandafter\page_inserts_process\csname\??insertionnumber\currentinsertion\endcsname}%
          \count\currentinsertionnumber\plusthousand
          \skip \currentinsertionnumber\zeropoint
          \dimen\currentinsertionnumber\maxdimen
       \fi
    \else
      \expandafter\let\csname\??insertionnumber\currentinsertion\expandafter\endcsname
                      \csname\??insertionnumber\currentinsertionparent\endcsname
    \fi
\to \everydefineinsertion

\appendtoks
    \ifx\currentinsertionparent\empty \else
        \clf_setupinsertion
          {\currentinsertion}
          {%
            location {\insertionparameter\c!location}%
          }%
        \relax
    \fi
\to \everysetupinsertion

\unexpanded\def\page_inserts_set_location#1#2% fast one
  {\clf_setinsertionlocation{#1}{#2}}

%D Auxiliary macros:

\def\page_insert_insertion_height#1%
  {\dimexpr\expandafter\page_insert_insertion_height_indeed\csname\??insertionnumber#1\endcsname\relax}

\def\page_insert_insertion_height_indeed#1%
  {\ifvoid#1\zeropoint\else1\skip#1+\ht#1\fi}

%D Obsolete:

% \installcorenamespace{insertionbackup}
%
% \unexpanded\def\installbackupinsertion#1%
%   {\ifcsname\??insertionbackup\string#1\endcsname \else
%      \expandafter\newinsert\csname\??insertionbackup\string#1\endcsname
%      \count\csname\??insertionbackup\string#1\endcsname\zerocount
%      \skip \csname\??insertionbackup\string#1\endcsname\zeropoint
%      \dimen\csname\??insertionbackup\string#1\endcsname\maxdimen
%    \fi}
%
% \unexpanded\def\saveinsertionbox#1% hm, actually unknown
%   {\global\setbox\csname\??insertionbackup\string#1\endcsname
%      \ifdim\ht#1>\zeropoint\box#1\else\emptybox\fi}
%
% \unexpanded\def\restoreinsertionbox#1%
%   {\ifvoid\backupinsertion#1\else % if void, we keep the content
%      \global\setbox#1\box\csname\??insertionbackup\string#1\endcsname
%    \fi}
%
% \unexpanded\def\eraseinsertionbackup#1%
%   {\global\setbox\csname\??insertionbackup\string#1\endcsname\emptybox}
%
% \unexpanded\def\saveinsertiondata#1%
%   {\global\skip \csname\??insertionbackup\string#1\endcsname\skip #1%
%    \global\count\csname\??insertionbackup\string#1\endcsname\count#1%
%    \global\dimen\csname\??insertionbackup\string#1\endcsname\dimen#1}
%
% \unexpanded\def\restoreinsertiondata#1%
%   {\global\skip #1\skip \csname\??insertionbackup\string#1\endcsname
%    \global\count#1\count\csname\??insertionbackup\string#1\endcsname
%    \global\dimen#1\dimen\csname\??insertionbackup\string#1\endcsname}

\protect \endinput

