mtx-context-module.tex / last modification: 2020-01-30 14:16
%D \module
%D   [       file=mtx-context-modules,
%D        version=2018.02.24, % very old stuff, now also as extra
%D          title=\CONTEXT\ Extra Trickry,
%D       subtitle=Module TYpesetting,
%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.

%D This is a \TEXEXEC\ features that has been moved to \MKIV.

% begin help
%
% usage: context --extra=listing [options] list-of-files
%
% end help

\input mtx-context-common.tex

\usemodule[scite]
\usemodule[module-basic]

\dontcomplain

\starttext

\startluacode
    local find, gsub, match, sub = string.find, string.gsub, string.match, string.sub
    local formatters, strip, splitlines, is_empty = string.formatters, string.strip, string.splitlines, string.is_empty

    local types = {
            mkiv = "tex",
            mkii = "tex",
            cld  = "lua",
            lfg  = "lua",
            mpiv = "mp",
            mpii = "mp",
        }

    local function process(inpname,filetype)
        local data = io.loaddata(inpname)
        if data and data ~= "" then
            local result       = { }
            local skiplevel    = 0
            local indocument   = false
            local indefinition = false
            local started      = false
            local settings     = formatters["type=%s"](filetype)
            local preamble, n  = lpeg.match(lpeg.Cs((1-lpeg.patterns.newline^2)^1) * lpeg.Cp(),data)
            local r            = 0
            if preamble then
                preamble = match(preamble,"\\module.-%[(.-)%]")
                if preamble then
                    preamble = gsub(preamble,"%%D *","")
                    preamble = gsub(preamble,"%%(.-)[\n\r]","")
                    preamble = gsub(preamble,"[\n\r]","")
                    preamble = strip(preamble)
                    settings = formatters["%s,%s"](settings,preamble)
                    data = sub(data,n,#data)
                end
            end
            local lines = splitlines(data)
            r = r + 1 ; result[r] = formatters["\\startmoduledocumentation[%s]"](settings)
            for i=1,#lines do
                local line = lines[i]
                if find(line,"^%%D ") or find(line,"^%%D$") then
                    if skiplevel == 0 then
                        local someline = #line < 3 and "" or sub(line,4,#line)
                        if indocument then
                            r = r + 1 ; result[r] = someline
                        else
                            if indefinition then
                                r = r + 1 ; result[r] = "\\stopdefinition"
                                indefinition = false
                            end
                            if not indocument then
                                r = r + 1 ; result[r] = "\\startdocumentation"
                            end
                            r = r + 1 ; result[r] = someline
                            indocument = true
                        end
                    end
                elseif find(line,"^%%M ") or find(line,"^%%M$") then
                    if skiplevel == 0 then
                        local someline = (#line < 3 and "") or sub(line,4,#line)
                        r = r + 1 ; result[r] = someline
                    end
                elseif find(line,"^%%S B") then
                    skiplevel = skiplevel + 1
                elseif find(line,"^%%S E") then
                    skiplevel = skiplevel - 1
                elseif find(line,"^%%") then
                    -- nothing
                elseif skiplevel == 0 then
                    inlocaldocument = indocument
                    inlocaldocument = false
                    local someline = line
                    if indocument then
                        r = r + 1 ; result[r] = "\\stopdocumentation"
                        indocument = false
                    end
                    if indefinition then
                        if is_empty(someline) then
                            r = r + 1 ; result[r] = "\\stopdefinition"
                            indefinition = false
                        else
                            r = r + 1 ; result[r] = someline
                        end
                    elseif not is_empty(someline) then
                        r = r + 1 ; result[r] = "\\startdefinition"
                        indefinition = true
                        if inlocaldocument then
                            -- nothing
                        else
                            r = r + 1 ; result[r] = someline
                        end
                    end
                end
            end
            if indocument then
                r = r + 1 ; result[r] = "\\stopdocumentation"
            end
            if indefinition then
                r = r + 1 ; result[r] = "\\stopdefinition"
            end
            r = r + 1 ; result[r] = "\\stopmoduledocumentation"
            result = table.concat(result,"\r")
            buffers.assign("module",result)
            context.getbuffer { "module" }
        end
    end

    local pattern = document.arguments.pattern

    if pattern then
        document.files = dir.glob(pattern)
    end

    local done  = false
    local files = document.files

    if #files > 0 then
        if document.arguments.sort then
            table.sort(files)
        end
        for i=1,#files do
            local filename = files[i]
            if not find(filename,"^mtx%-context%-") then
                local suffix = file.extname(filename) or ""
                process(filename,types[suffix] or suffix)
                done = true
            end
        end
    end

    if not done then
        context("no files given")
    end

\stopluacode

\stoptext