% engine=luatex

%D \module
%D   [       file=mtx-context-combine,
%D        version=2009.03.21,
%D          title=\CONTEXT\ Extra Trickry,
%D       subtitle=Combine Files,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright=\PRAGMA]
%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 \TEXEXEC\ features that has been moved to \MKIV.

% begin help
%
% usage: context --extra=combine [options] list-of-files
%
% --sort                  : sort filenames first
% --paperoffset=dimension : left-top-offset
% --nobanner              : no footer etc
% --combination           : h*v or hxv
% --paperformat           : paper*print or paperxprint
% --nobanner              : no footerlines
% --bannerheight          : height of banner
% --bannerstring          : height of bannerstring
%
% end help

\doifdocumentargumentelse {paperoffset} {

    \setuplayout
      [topspace=\getdocumentargument{paperoffset},
       backspace=\getdocumentargument{paperoffset}]

} {

    \setuplayout
      [topspace=0pt,
       backspace=0pt]

}

\setuplayout
  [header=0pt,
   footer=0pt,
   width=middle,
   height=middle]

\startluacode
    local combination = document.arguments['combination'] or '2*2'
    local nx, ny = string.match(combination,"^(%d+)%s*[%*x]%s*(%d+)$")
    if not nx then
        nx, ny = 2, 2
    elseif not ny then
        nx = tonumber(combination) or 2
        ny = nx
    else
        nx = tonumber(nx) or 2
        ny = tonumber(ny) or nx or 2
    end
    document.setargument("nx",nx)
    document.setargument("ny",ny)
\stopluacode

\startluacode
    local paperformat = document.arguments['paperformat'] or 'A4*A4'
    paperformat = string.upper(paperformat)
    local f, t = string.match(paperformat,"^(.-)%s*[%*xX]%s*(.-)$")
    if not f then
        f, t = "A4", "A4"
    elseif not t then
        t = f
    end
    document.setargument("from",f)
    document.setargument("to",t)
\stopluacode

\setuppapersize
  [\getdocumentargument{from}]
  [\getdocumentargument{to}]

\doifnotdocumentargument {bannerheight} {
    \setuplayout
        [footer=1cm]
}

\doifdocumentargumentelse {nobanner} {yes} {
    \setuplayout
      [footer=0cm]
    \setupbackgrounds
      [page]
      [background=]
} {
    \definelayer
      [page]
      [width=\paperwidth,
       height=\paperheight]

    \setupbackgrounds
      [page]
      [background=page]
}

\setupexternalfigures
  [directory=]

\starttext

\startluacode
    local format = string.format
    local fprint = function(...) tex.sprint(tex.ctxcatcodes,format(...)) end

    if #document.files > 0 then
        if document.arguments["sort"] then
            table.sort(document.files)
        end
        local dobanner = not document.arguments["nobanner"]
        local bannerheight = document.arguments["bannerheight"]
        local nx = document.arguments.nx or 2
        local ny = document.arguments.ny or 2
        for _, filename in ipairs(document.files) do
            if not string.find(filename,"^mtx%-context%-") then
                -- could be a macro
                local bannerstring = format("\\tttf\\detokenize{%s}\\quad\\quad\\currentdate\\quad\\quad\\pagenumber",file.basename(filename))
                if dobanner then
                    if bannerheight then
                        fprint("\\setuptexttexts[{\\setlayerframed[page][preset=middlebottom][frame=off,height=%s]{%s}}]",bannerheight,bannerstring)
                    else
                        fprint("\\setupfootertexts[{%s}]",bannerstring)
                    end
                end
                fprint("\\combinepages[%s][nx=%s,ny=%s]",filename,nx,ny)
                fprint("\\page")
            end
        end
    else
        fprint("no files given")
    end
\stopluacode

\stoptext

