\long\def\iflatex#1{%
  \expandafter\ifx\csname usepackage\endcsname\relax\else #1\fi
}
\long\def\ifcontext#1{%
  \expandafter\ifx\csname contextformat\endcsname\relax\else #1\fi
}
\iflatex{\documentclass{article}}
\input ../tex/crossrefenum
\crfnmOriginalCatcodeAt=\catcode`\@
\catcode`\@=11
\input config-formats
\input format-specific-defs
\catcode`\@=\crfnmOriginalCatcodeAt
\input config-crossrefenum

%\tracingmacros=1
%\tracingcommands=2
%\tracingoutput=2
\showboxbreadth=100
\showboxdepth=50

\def\withvisiblespace{\tt}

\catcode`\@=11
\ifcontext{
\def\crfnm@line{Line}
\def\crfnm@pageline{Pageline}
\crfnm@newListFrom[\crfnm@simpleRefTypes][\crfnm@line] -> \crfnm@simpleRefTypes
\crfnm@newListFrom[\crfnm@doubleRefTypes][\crfnm@pageline] -> \crfnm@doubleRefTypes
\let\crfnm@PagelinePrimary\crfnm@page
\let\crfnm@PagelineSecondary\crfnm@line
\def\crfnm@LineRef#1{\in[lr:b:#1]}
\def\crfnm@getLineNumber#1{\directlua{get_raw_ref_number('lr:b:#1', 'linenumber')}}
\def\crfnmLine{l. }
\def\crfnmLines{ll.}
\def\crfnmLineBeforeLastInSecond{, }
\def\crfnmPagelineSubtypesSep{}
\def\crfnmPagelinePrintFirstPrefix{once}
\def\crfnmLineFormatInSecond#1{\crfnmSuperscript{#1}}
\def\crfnmLinePrintPrefixInSecond{no}
}
\catcode`\@=\crfnmOriginalCatcodeAt

\parindent=0pt

\long\def\crfnmtestenum#1#2#3#4#5{%
  \def\crfnmtestdesc{#1}
  \def\crfnmempty{}
  \ifx\crfnmtestdesc\crfnmempty\else
    \vskip2.5\bigskipamount
    \vbox{%
      \lineskiplimit=10000pt\lineskip=1ex
      \parskip=2ex
      
      {\it #1}
      
      \everypar={\leftskip=1em}
      
      \raggedright Enumeration: \allowbreak{\tt\detokenize{#2}}
      
      Reference type: {\tt #3}
      
      Expected: {\withvisiblespace [#5]}
      
      Result: \hbox to 1.3em{}{\withvisiblespace [\crossrefenum[#3][#4]{#2}]}
      
    }%
  \fi
}

\long\def\crfnmheader#1{\vskip3\bigskipamount{\crfnmsc #1}\par\nobreak}

\def\crfnmverbatim#1{{\tt\detokenize{#1}}}

\iflatex{
  \begin{document}
  \begin{english}
}
\ifcontext{
  \starttext
  \language[en]
}

\vfill

\crfnmheader{All references point to different pages}

\crfnmtestenum{Nothing}
{}
{page}
{withprefix}
{}

\crfnmtestenum{One single page}
{{matthaeus-14}}
{page}
{withprefix}
{p. 2}

\crfnmtestenum{One single page without prefix}
{{matthaeus-18}}
{page}
{noprefix}
{2}

\crfnmtestenum{Two single pages}
{{matthaeus-14}{matthaeus-025}}
{page}
{withprefix}
{pp. 2 and 4}

\crfnmtestenum{Two single pages without prefix}
{{matthaeus-19}{matthaeus-0210}}
{page}
{noprefix}
{2 and 4}

\crfnmtestenum{More than two single pages}
{{matthaeus-14}{matthaeus-026}{matthaeus-0223}}
{page}
{withprefix}
{pp. 2, 4 and 6}

\crfnmtestenum{One single page again}
{{matthaeus-027}}
{page}
{withprefix}
{p. 4}

\crfnmtestenum{One range}
{{matthaeus-14 to matthaeus-23}}
{page}
{withprefix}
{pp. 2-3}

\crfnmheader{Some references point to the same page}

\crfnmtestenum{One range that returns a single page}
{{matthaeus-027 to matthaeus-029}}
{page}
{withprefix}
{p. 4}

\crfnmtestenum{Two identical pages}
{{matthaeus-026}{matthaeus-028}}
{page}
{withprefix}
{p. 4}

\crfnmtestenum{A range followed by a reference on its end page}
{{matthaeus-2 to matthaeus-15}{matthaeus-16}}
{page}
{withprefix}
{pp. 1-2}

\crfnmtestenum{Two ranges with a common boundary}
{{matthaeus-5 to matthaeus-21}{matthaeus-25 to matthaeus-0214}}
{page}
{withprefix}
{pp. 1-5}

\crfnmtestenum{Two ranges with a common boundary, the second one having boths ends on a single page}
{{matthaeus-5 to matthaeus-21}{matthaeus-25 to matthaeus-022}}
{page}
{withprefix}
{pp. 1-3}

\crfnmtestenum{A range followed by a reference to its end page and a reference to another page}
{{matthaeus-2 to matthaeus-15}{matthaeus-16}{matthaeus-0216}}
{page}
{withprefix}
{pp. 1-2 and 5}

\crfnmtestenum{A range followed by two references to its end page}
{{matthaeus-2 to matthaeus-15}{matthaeus-16}{matthaeus-18}}
{page}
{withprefix}
{pp. 1-2}

\crfnmtestenum{A range preceded by a reference to its begin page}
{{matthaeus-1}{matthaeus-2 to matthaeus-15}}
{page}
{withprefix}
{pp. 1-2}

\crfnmheader{Some references point to successive pages}

\crfnmtestenum{Successive pages forming a range}
{{matthaeus-2}{matthaeus-15}{matthaeus-22}{matthaeus-025}}
{page}
{withprefix}
{pp. 1-4}

\crfnmtestenum{A range followed by a page that extends it}
{{matthaeus-2 to matthaeus-15}{matthaeus-22}}
{page}
{withprefix}
{pp. 1-3}

\crfnmtestenum{A range preceded by a page that extends it}
{{matthaeus-1}{matthaeus-14 to matthaeus-0210}}
{page}
{withprefix}
{pp. 1-4}

\crfnmtestenum{A range extended by another range}
{{matthaeus-2 to matthaeus-15}{matthaeus-22 to matthaeus-025}}
{page}
{withprefix}
{pp. 1-4}

\crfnmheader{References to notes}

\crfnmtestenum{One note}
{{note-Aminadab-undecim}}
{note}
{withprefix}
{n. 1}

\crfnmtestenum{Two notes}
{{note-autem-non}{note-generatio-Persarum}}
{note}
{withprefix}
{nn. 2 and 4}

\crfnmtestenum{Two consecutive notes}
{{note-autem-non}{note-generationes-quis}}
{note}
{withprefix}
{nn. 2 and 3}

\crfnmtestenum{Three consecutive notes}
{{note-congregans-conteram}{note-Israhel-mittam}{note-regem-Theman}}
{note}
{withprefix}
{nn. 1, 2 and 3}

\crfnmheader{References to notes with page number}

\crfnmtestenum{One note with page number}
{{note-Babylonis-Libani}}
{pagenote}
{withprefix}
{p. 2, n. 1}

\def\crfnmPagenoteOrder{inverted}
\crfnmtestenum{Same thing, but with \crfnmverbatim{\crfnmPagenoteOrder} set to {\tt inverted}}
{{note-quaerat-clamate}}
{pagenote}
{withprefix}
{n. 3, p. 5}
\def\crfnmPagenoteOrder{normal}

\crfnmtestenum{Four notes on different pages}
{{note-Aminadab-undecim}{note-generationes-quis}{note-regem-Theman}}
{pagenote}
{withprefix}
{p. 1, n. 1, p. 2, n. 3 and p. 4, n. 3}

\def\crfnmPagenotePrintFirstPrefix{once}
\crfnmtestenum{Same thing, but with \crfnmverbatim{\crfnmPagenotePrintFirstPrefix} set to {\tt once}}
{{note-Aminadab-undecim}{note-generationes-quis}{note-regem-Theman}}
{pagenote}
{withprefix}
{pp. 1, n. 1, 2, n. 3 and 4, n. 3}
\def\crfnmPagenotePrintFirstPrefix{always}

\crfnmtestenum{Several notes on the same page}
{{note-et-et}{note-puerum-et}{note-habitavit-quae}}
{pagenote}
{withprefix}
{p. 6, nn. 1, 3 and 4}

\crfnmtestenum{Same thing, but followed by an isolated reference on another page}
{{note-somnis-hic}{note-cum-haec}{note-quaerat-clamate}}
{pagenote}
{withprefix}
{p. 3, nn. 1 and 2 and p. 5, n. 3}

\def\crfnmPagenoteOrder{inverted}
\crfnmtestenum{Same thing, but with \crfnmverbatim{\crfnmPagenoteOrder} set to {\tt inverted}}
{{note-somnis-hic}{note-cum-haec}{note-quaerat-clamate}{note-obitum-mittite}}
{pagenote}
{withprefix}
{nn. 1 and 2, p. 3 and nn. 3 and 4, p. 5}
\def\crfnmPagenoteOrder{normal}

\iflatex{

  \crfnmheader{Reledmac}
  
  \crfnmtestenum{Simple reference to a line}
  {{vulgate-12}}
  {edline}
  {withprefix}
  {l. 8}
  
  \crfnmtestenum{Simple reference to page and line}
  {{vulgate-14}}
  {edpageline}
  {withprefix}
  {p. 8\crfnmSuperscript{12}}
  
  \crfnmtestenum{Several lines on different pages}
  {{vulgate-15}{vulgate-24}{vulgate-215}}
  {edpageline}
  {withprefix}
  {pp. 8\crfnmSuperscript{13}, 9\crfnmSuperscript{15} and 11\crfnmSuperscript{13}}
  
  \crfnmtestenum{A range of lines on a single page}
  {{vulgate-22 to vulgate-23}}
  {edpageline}
  {withprefix}
  {p. 9\crfnmSuperscript{9-11}}
  
  \crfnmtestenum{A range of lines on two different pages}
  {{vulgate-24 to vulgate-212}}
  {edpageline}
  {withprefix}
  {pp. 9\crfnmSuperscript{15}-11\crfnmSuperscript{6}}
  
  \def\crfnmEdpagelineGroupSubtypes{yes}
  \crfnmtestenum{A range of lines on two different pages
    with \crfnmverbatim{\crfnmEdpagelineGroupSubtypes} set to {\tt yes}}
  {{vulgate-11 to vulgate-215}}
  {edpageline}
  {withprefix}
  {pp. 8-11\crfnmSuperscript{4-13}}
  \def\crfnmEdpagelineGroupSubtypes{no}
  
  \crfnmtestenum{Two ranges of lines on the same page that should be merged}
  {{vulgate-211 to vulgate-212}{vulgate-213 to vulgate-217}}
  {edpageline}
  {withprefix}
  {p. 11\crfnmSuperscript{4-19}}
  
  \crfnmtestenum{Two ranges of lines on the same page that should not be merged}
  {{vulgate-219 to vulgate-221}{vulgate-224 to vulgate-227}}
  {edpageline}
  {withprefix}
  {p. 12\crfnmSuperscript{1-6, 12-19}}
  
  \crfnmtestenum{Two ranges of lines spanning across pages that should be merged}
  {{vulgate-214 to vulgate-223}{vulgate-224 to vulgate-233}}
  {edpageline}
  {withprefix}
  {pp. 11\crfnmSuperscript{10}-13\crfnmSuperscript{15}}
  
  \crfnmtestenum{Two ranges of lines on consecutive pages,
    the beginning of the second being at the same line number as the end of the first + 1.
    They should not be merged, since the document is lineated per page.}
  {{vulgate-2 to vulgate-6}{vulgate-14 to vulgate-18}}
  {edpageline}
  {withprefix}
  {pp. 7\crfnmSuperscript{3-11} and 8\crfnmSuperscript{12-20}}
  
  \def\crfnmEdlineNumberingContinuousAcrossDocument{yes}
  \crfnmtestenum{Same as the above, but with
    \crfnmverbatim{\crfnmEdlineNumberingContinuousAcrossDocument} set to {\tt yes}.
    We make {\em crossrefenum} believe that the first range ends at the end of a page
    and the second begins at the first line of the following page.}
  {{vulgate-2 to vulgate-6}{vulgate-14 to vulgate-18}}
  {edpageline}
  {withprefix}
  {pp. 7\crfnmSuperscript{3}-8\crfnmSuperscript{20}}
  \def\crfnmEdlineNumberingContinuousAcrossDocument{no}
  
 \crfnmtestenum{A range of lines whose page boundaries are identical to those of the preceding and following references}
 {{vulgate-3}{vulgate-7 to vulgate-20}{vulgate-25}}
 {edpageline}
 {withprefix}
 {pp. 7\crfnmSuperscript{5}, 7\crfnmSuperscript{13}-9\crfnmSuperscript{5} and 9\crfnmSuperscript{17}}

}

\ifcontext{

  \crfnmheader{References to lines}

  {See the tests on reledmac in the file produced by LaTeX for a more extensive coverage.}\vskip\baselineskip
  
  \crfnmtestenum{Simple reference to a line}
  {{soph-2}}
  {line}
  {withprefix}
  {l. 3}
  
  \crfnmtestenum{Simple reference to page and line}
  {{soph-5}}
  {pageline}
  {withprefix}
  {p. 7\crfnmSuperscript{9}}
  
  \crfnmtestenum{Several lines on different pages}
  {{soph-7}{soph-13}{soph-012}}
  {pageline}
  {withprefix}
  {pp. 7\crfnmSuperscript{12}, 8\crfnmSuperscript{5} and 10\crfnmSuperscript{3}}
  
  \crfnmtestenum{A range of lines on a single page}
  {{soph-04 to soph-06}}
  {pageline}
  {withprefix}
  {p. 9\crfnmSuperscript{5-9}}

  \crfnmtestenum{A range of lines on two different pages}
  {{soph-14 to soph-014}}
  {pageline}
  {withprefix}
  {pp. 8\crfnmSuperscript{8}-10\crfnmSuperscript{6}}

  \crfnmtestenum{}
  {}
  {}
  {}
  {}
  
  \crfnmtestenum{}
  {}
  {}
  {}
  {}
  
}

\vfill\penalty-10000

\crfnmheader{With a comma-delimited list of references instead of a list of groups}

\crfnmtestenum{One single page without an inner group}
{matthaeus-14}
{page}
{withprefix}
{p. 2}

\crfnmtestenum{Three references without spaces}
{matthaeus-14,matthaeus-025,matthaeus-0223}
{page}
{withprefix}
{pp. 2, 4 and 6}

\crfnmtestenum{Three references with spaces}
{matthaeus-14, matthaeus-025, matthaeus-0223}
{page}
{withprefix}
{pp. 2, 4 and 6}

\crfnmtestenum{With a double type}
{note-Aminadab-undecim, note-generationes-quis, note-regem-Theman}
{pagenote}
{withprefix}
{p. 1, n. 1, p. 2, n. 3 and p. 4, n. 3}

\crfnmheader{Key-value configuration interface}

Heavily modified setup for {\tt page}, {\tt note} and {\tt pagenote} with \crfnmverbatim{\crfnmsetup}

\crfnmsetup[page]{
  sg = {page },
  pl = {pages },
  delimiter = {; },
  before last reference = { AND },
  range separator = { to },
  collapsable? = yes
}

\crfnmsetup[note]{
  sg = {note },
  pl = {notes },
  print prefix when second subtype? = no,
  delimiter when second subtype = +,
  before last reference when second subtype = { And },
  formatting when second subtype = \textit % single-arg macro
}

\crfnmsetup[pagenote]{
  delimiter = {; },
  before last reference = { AND },
  range separator = { to },
  subtypes separator = { in },
  print prefix of first subtype = once,
  group subtypes? = no,
  continuous numbering? = no
}

\crfnmtestenum{Simple type}
{matthaeus-14, matthaeus-025, matthaeus-0223}
{page}
{withprefix}
{pages 2; 4 AND 6}

\crfnmtestenum{Simple type with a range}
{{matthaeus-2 to matthaeus-15}{matthaeus-16}}
{page}
{withprefix}
{pages 1 to 2}

\crfnmtestenum{Double type}
{note-Aminadab-undecim, note-generationes-quis, note-congregans-conteram, note-Israhel-mittam, note-regem-Theman}
{pagenote}
{withprefix}
{pages 1 in \textit{1}; 2 in \textit{3} AND \textit{4} in \textit{1+2 And 3}}

\crfnmsetup[page]{
  collapsable? = no
}

\crfnmtestenum{Pages are not collapsable anymore!}
{{matthaeus-2}{matthaeus-15}{matthaeus-22}{matthaeus-025}}
{page}
{withprefix}
{pages 1; 2; 3 AND 4}

\iflatex{\end{english}}
\ifcontext{
  \language[latin]
  \setupinterlinespace[big]
}

\vfill\penalty-10000

\crfnmresetpage

\input data-common

\iflatex{\input data-reledmac}

\input data-lines

\ifcontext{\let\crfnmtheend\stoptext}
\iflatex{\def\crfnmtheend{\end{document}}}
\crfnmtheend
