%D \module
%D   [       file=strc-lnt,
%D        version=2002.05.10,
%D          title=\CONTEXT\ Structure Macros,
%D       subtitle=Line Notes,
%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 Structure Macros / Line Notes}

%D This module loads on top of the footnote and line numbering macros.

\unprotect

\newcounter\linenotecounter
\newtoks   \collectedlinenotes
\newif     \iftracelinenotes

\appendtoks
  \the\collectedlinenotes
\to \everylinenumber

\appendtoks
  \global\collectedlinenotes\emptytoks
\to \beforeeverylinenumbering

\def\dohandlelinenote#1#2#3%
  {\bgroup
   \expanded{\beforesplitstring#2}\at--\to\linenotelinenumber
   \ifnum\linenotelinenumber=\linenumber\relax
    % todo: \onlyfootnote{#2}{#3}% == configurable
    % \setupnote[#1][\c!numbercommand=\gobbleoneargument]%
    % \setnotetext[#1]{\rawreference\s!fnt{\s!fnt:f:\number\internalnotereference}{}#2: #3}%
      \def\linenotelinenumber##1{#2}%
      \setupnote[#1][\c!numbercommand=\linenotelinenumber,\c!textcommand=\gobbleoneargument]%
      \setnote[#1]{#3}%
   \fi
   \egroup}

\def\dotracedlinenote#1%
  {\iftracelinenotes
     \hbox to \zeropoint
       {\forgetall
        \localcolortrue
        \hsize\zeropoint
        \hss
        \vbox to \strutheight{\llap{\red\infofont\setstrut\linenotecounter}\vss}%
        {\color[blue]{\vl}}%
        \vbox to \strutheight{\rlap{\red\infofont\setstrut#1}\vss}%
        \hss}%
      \prewordbreak
   \fi}

\def\dolinenote#1#2%
  {\doglobal\increment\linenotecounter
   \doifreferencefoundelse{\??rr:\linenotecounter}%
     {\expanded{\doglobal\noexpand\appendtoks\noexpand\dohandlelinenote
        {#1}{\currenttextreference}}{#2}\to\collectedlinenotes}
     \donothing
   \dotracedlinenote\empty
   \expanded{\someline[\??rr:\linenotecounter]}}

\def\dostartlinenote#1[#2]#3%
  {\doifreferencefoundelse{\??rr:#2}%
     {\expanded{\doglobal\noexpand\appendtoks\noexpand\dohandlelinenote
        {#1}{\currenttextreference}}{#3}\to\collectedlinenotes}
     \donothing
   \dotracedlinenote{#2}%
   \startline[\??rr:#2]}

\def\dostoplinenote#1[#2]%
  {\stopline[\??rr:#2]}

% defining them

\def\definelinenote
  {\dodoubleempty\dodefinelinenote}

\def\dodefinelinenote[#1][#2]%
  {\definenote[#1][#2]%
   \setvalue        {#1}{\dolinenote     {#1}}%
   \setvalue{\e!start#1}{\dostartlinenote{#1}}%
   \setvalue{\e!stop #1}{\dostoplinenote {#1}}}

\def\setuplinenote % convenient
  {\setupnote}

% We predefine one, namely \type {\linenote} cum suis.

\definelinenote[\v!linenote]

% \startbuffer[test]
% \startlinenumbering[100]
% test \linenote {oeps} test test test test test test
% test \startlinenote [well] {oeps} test test test test test test
% test \linenote {oeps} test test test test test test
% test \linenote {oeps} test test test test test test
% test \linenote {oeps} test test test test test test
% test \linenote {oeps} test test test test test test
% test \stoplinenote [well] test test test test test test
% \stoplinenumbering
% \stopbuffer
%
% \setupnotedefinition[linenote] [location=serried,distance=.5em]
%
% {\typebuffer[test] \getbuffer[test]} \page
%
% \startbuffer[setup]
% \setuplinenumbering
%   [align=left]
% \stopbuffer
%
% {\typebuffer[setup] \getbuffer[setup,test]} \page
%
% \startbuffer[setup]
% \setuplinenumbering
%   [width=1em,
%    align=left]
% \stopbuffer
%
% {\typebuffer[setup] \getbuffer[setup,test]} \page
%
% \startbuffer[setup]
% \setuplinenumbering
%   [width=2em,
%    distance=.5em,
%    align=left]
% \stopbuffer
%
% {\typebuffer[setup] \getbuffer[setup,test]} \page
%
% \startbuffer[setup]
% \setuplinenumbering
%   [width=2em,
%    align=middle]
% \stopbuffer
%
% {\typebuffer[setup] \getbuffer[setup,test]} \page
%
% \startbuffer[setup]
% \setuplinenumbering
%   [conversion=romannumerals,
%    start=1,
%    step=1,
%    location=text,
%    style=slanted,
%    color=blue,
%    width=1.5em]
% \stopbuffer
%
% {\typebuffer[setup] \startnarrower\getbuffer[setup,test]\stopnarrower} \page
%
% \startbuffer[setup]
% \setuplinenumbering
%   [width=4em,
%    left=--,
%    right=--,
%    align=middle]
% \stopbuffer
%
% {\typebuffer[setup] \getbuffer[setup,test]} \page
%
% \startbuffer[setup-1]
% \setuplinenumbering
%   [style=\bfxx,
%    command=\WatchThis]
% \stopbuffer
%
% \startbuffer[setup-2]
% \def\WatchThis#1%
%   {\ifodd\linenumber
%      \definecolor[linecolor][red]%
%    \else
%      \definecolor[linecolor][green]%
%    \fi
%    \inframed
%      [offset=1pt,frame=off,background=color,backgroundcolor=linecolor]
%      {#1}}
% \stopbuffer
%
% {\typebuffer[setup-1,setup-2] \getbuffer[setup-1,setup-2,test]} \page
%
% \startbuffer[setup-1]
% \setuplinenumbering
%   [location=inright,
%    style=\bfxx,
%    command=\WatchThis]
% \stopbuffer
%
% {\typebuffer[setup-1] \getbuffer[setup-1,setup-2,test]} \page

\protect \endinput
