if not modules then modules = { } end modules ['typo-prc'] = {
    version   = 1.001,
    comment   = "companion to typo-prc.mkiv",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files"
}

-- moved from strc-ini.lua


local format = string.format
local lpegmatch, patterns, P, C, Cs = lpeg.match, lpeg.patterns, lpeg.P, lpeg.C, lpeg.Cs

-- processors: syntax: processor->data ... not ok yet

typesetters.processors = typesetters.processors   or { }
local processors       = typesetters.processors

local trace_processors  = false
local report_processors = logs.reporter("processors")
local registered        = { }

trackers.register("typesetters.processors", function(v) trace_processors = v end)

function processors.register(p)
    registered[p] = true
end

function processors.reset(p)
    registered[p] = nil
end

--~ local splitter = lpeg.splitat("->",true) -- also support =>

local becomes    = P('->')
local processor  = (1-becomes)^1
local splitter   = C(processor) * becomes * Cs(patterns.argument + patterns.content)

function processors.split(str)
    local p, s = lpegmatch(splitter,str)
    if registered[p] then
        return p, s
    else
        return false, str
    end
end

function processors.apply(p,s)
    local str = p
    if s == nil then
        p, s = lpegmatch(splitter,p)
    end
    if p and registered[p] then
        if trace_processors then
            report_processors("known: %s, argument: %s",p,s or "")
        end
        context.applyprocessor(p,s)
    elseif s then
        if trace_processors then
            report_processors("unknown: %s, argument: %s",p or "?",s)
        end
        context(s)
    elseif str then
        if trace_processors then
            report_processors("direct: %s",str)
        end
        context(str)
    end
end

function processors.startapply(p,s)
    local str = p
    if s == nil then
        p, s = lpegmatch(splitter,p)
    end
    if p and registered[p] then
        if trace_processors then
            report_processors("start: %s",p or "?")
        end
        context.applyprocessor(p)
        context("{")
        return s
    elseif p then
        if trace_processors then
            report_processors("start: %s (unknown)",p)
        end
        context.firstofoneargument()
        context("{")
        return s
    else
        if trace_processors then
            report_processors("start: ? (unset)")
        end
        context.firstofoneargument()
        context("{")
        return str
    end
end

function processors.stopapply()
    context("}")
    if trace_processors then
        report_processors("stop")
    end
end

function processors.tostring(str)
    local p, s = lpegmatch(splitter,str)
    if registered[p] then
        return format("\\applyprocessor{%s}{%s}",p,s)
    else
        return str
    end
end

function processors.stripped(str)
    local p, s = lpegmatch(splitter,str)
    return s or str
end

-- interface

commands.registerstructureprocessor = processors.register
commands.resetstructureprocessor    = processors.reset

