%D \module
%D   [       file=m-simulate,
%D        version=2016.02.18, % follow up on m-visual of 2000.01.10
%D          title=\CONTEXT\ Extra Modules,
%D       subtitle=Visualization and Faking Redone,
%D         author={Hans Hagen \& Ton Otten},
%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.

\unprotect

\definepalet
  [fakerule]
  [fr1c=darkred,
   fr2c=darkgreen,
   fr3c=darkblue,
   fr4c=darkyellow,
   fr5c=darkgray,
   fr6c=darkred,
   fr7c=darkgreen,
   fr8c=darkblue,
   fr9c=darkyellow,
   fr0c=darkgray]

\installcorenamespace {simulatewords}

\installcommandhandler \??simulatewords {simulatewords} \??simulatewords

\setupsimulatewords
  [\c!n       =\plusten,
   \c!m       =40,
   \c!min     =\plusone,
   \c!max     =\plusfive,
   \c!minwidth=0.50\emwidth,
   \c!maxwidth=1.25\emwidth,
   \c!color   =\empty,
   \c!hyphen  =\v!yes,
   \c!distance=-.2\onebasepoint]

\unexpanded\def\dosimulatedword
  {\clf_fakeword
      factor \exheight
      name   {\p_line}
      min    \scratchdimenone
      max    \scratchdimentwo
   \relax}

\def\simulatedhyphen
  {\kern.2\points-\kern.2\points}

\unexpanded\def\simulatewords
  {\dodoubleempty\dosimulatewords}

\unexpanded\def\dosimulatewords[#1][#2]%
  {\dontleavehmode
   \begingroup
   \begstrut
   \ifsecondargument
     \edef\currentsimulatewords{#1}%
     \setupcurrentsimulatewords[#2]%
   \else
     \doifassignmentelse{#1}
       {\let\currentsimulatewords\empty
        \setupcurrentsimulatewords[#1]}
       {\edef\currentsimulatewords{#1}%
        \setupcurrentsimulatewords[#2]}%
   \fi
   \scratchcounterone\simulatewordsparameter\c!n
   \scratchcountertwo\simulatewordsparameter\c!m
   \scratchmin       \simulatewordsparameter\c!min
   \scratchmax       \simulatewordsparameter\c!max
   \scratchdimenone  \simulatewordsparameter\c!minwidth
   \scratchdimentwo  \simulatewordsparameter\c!maxwidth
   \scratchdimenthree\simulatewordsparameter\c!distance
   \edef\p_random{\simulatewordsparameter\c!random}%
   \edef\p_color {\simulatewordsparameter\c!color}%
   \edef\p_line  {\simulatewordsparameter\c!line}%
   \edef\p_hyphen{\simulatewordsparameter\c!hyphen}%
   \edef\p_line  {fake:\ifx\p_line\v!yes word\else rule\fi}%
   \ifx\p_color\v!text
     % no need
   \else
     \setuppalet[fakerule]%
     \ifx\p_color\empty
       \directcolored[fakerulecolor]%
     \else\ifx\p_color\v!auto
       % different
     \else
       \directcolored[\p_color]%
     \fi\fi
   \fi
   \edef\p_hyphen
     {\ifx\p_hyphen\v!yes
        \discretionary{\bf\simulatedhyphen}{}{\kern\scratchdimenthree}%
      \else\ifx\p_hyphen\v!margin
        \discretionary{\hpack to \zeropoint{\bf\simulatedhyphen\hss}}{}{\kern\scratchdimenthree}%
      \else\ifx\p_hyphen\v!none
        \allowbreak\kern\scratchdimenthree
      \else\ifx\p_hyphen\v!no
        \allowbreak\kern\scratchdimenthree
      \else\ifx\p_hyphen\v!both
        \discretionary{\bf\simulatedhyphen}{\bf\simulatedhyphen}{\kern\scratchdimenthree}%
      \else\ifx\p_hyphen\empty
        \allowbreak\kern\scratchdimenthree
      \else
        \discretionary{\p_hyphen}{}{\kern\scratchdimenthree}%
      \fi\fi\fi\fi\fi\fi}%
   \def\truncated##1##2\relax{##1}%
   % trialtypesetting: tricky
   \ifx\p_random\empty \else
     \pushrandomseed
     \setrandomseed\p_random
   \fi
   \dorecurse{\randomnumber\scratchcounterone\scratchcountertwo} {%
     \let\dosimulatedhyphen\relax
     \dorecurse{\randomnumber\scratchmin\scratchmax} {%
       \dosimulatedhyphen
       \begingroup
         \ifx\p_color\v!auto
           \directcolored[fr\truncated####1\relax c]%
         \fi
         \dosimulatedword
       \endgroup
       \let\dosimulatedhyphen\p_hyphen
     }%
     \relax
     \space
   }%
   \ifx\p_random\empty \else
     \poprandomseed
   \fi
   \removeunwantedspaces
   \endstrut
   \endgroup}

%D For old times sake:

\unexpanded\def\fakewords#1#2%
  {\simulatewords[\c!n=#1,\c!m=#2,\c!min=1,\c!max=5,\c!hyphen=\v!none,\c!color=\v!text,\c!line=\v!yes]}

%D Lines

\unexpanded\def\fakeline
  {\dosingleempty\dofakeline}

\unexpanded\def\dofakeline[#1]%
  {\par
   \dontleavehmode
   \hpack\bgroup
     \scratchwidth \availablehsize
     \scratchheight.8\strutht
     \scratchdepth .8\strutdp
     \iffirstargument
       \letsimulatewordsparameter\c!width \scratchwidth
       \letsimulatewordsparameter\c!height\scratchheight
       \letsimulatewordsparameter\c!depth \scratchdepth
       \getcurrentsimulatewords[#1]%
       \scratchwidth \simulatewordsparameter\c!width
       \scratchheight\simulatewordsparameter\c!height
       \scratchdepth \simulatewordsparameter\c!depth
     \fi
     \edef\p_color{\simulatewordsparameter\c!color}%
     \begingroup
     \ifx\p_color\empty
       \directcolored[fakerulecolor]%
     \else\ifx\p_color\v!auto
       % text color
     \else
       \directcolored[\p_color]%
     \fi\fi
     \vrule
        \s!width \scratchwidth
        \s!height\scratchheight
        \s!depth \scratchdepth
     \endgroup
     \hskip-\scratchwidth
     \directcolored[\s!white]%
     \scratchdimen.5\onepoint
     \vrule
        \s!width \scratchwidth
        \s!height\scratchdimen
        \s!depth \scratchdimen
   \egroup
   \par}

\protect

\continueifinputfile{m-simulate.mkiv}

\starttext

    \simulatewords[n=50,m=100,min=1,max=5,color=auto,hyphen=margin,line=yes]\par
    \simulatewords[n=50,m=100,min=3,max=9,color=auto,hyphen=margin,line=yes]\par
    \simulatewords[n=50,m=100,min=3,max=9,color=auto,hyphen=margin,line=yes]\par
    \page
    \simulatewords[n=50,m=100,min=2,max=6,hyphen=yes]\par
    \simulatewords[n=50,m=100,min=2,max=6,hyphen=both]\par
    \simulatewords[n=50,m=100,min=2,max=6,hyphen=both]\par

    \startcolor[red]
    \simulatewords[n=50,m=100,min=2,max=6,color=text]\par
    \stopcolor

    \definesimulatewords[foo][n=50,m=100,min=2,max=6,color=text]

    \startcolor[green]
    \simulatewords[foo][color=darkyellow,random=1234]
    \stopcolor

    \page

    \fakeline

    \startnarrower
        \fakeline
    \stopnarrower

\stoptext
