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

moduledata.languages         = moduledata.languages         or { }
moduledata.languages.goodies = moduledata.languages.goodies or { }

function moduledata.languages.goodies.show(specification)
    specification = interfaces.checkedspecification(specification)
    local filename = specification.file
    if filename and filename ~= "" then
        local list = table.load(resolvers.findfile(filename))
        if list then
            list = list.options
            if list then
                for i=1,#list do
                    local l = list[i]
                    local w = l.words
                    if w then
                        local pre = l.prefixes
                        local suf = l.suffixes
                        context.startsubject { title = table.concat(table.sortedkeys(l.patterns)," ") }
                            context(languages.strippedgoodiewords(w))
                            if pre then
                                context.blank()
                                context.bold("prefixes: ")
                                context(languages.strippedgoodiewords(pre))
                            end
                            if suf then
                                context.blank()
                                context.bold("suffixes: ")
                                context(languages.strippedgoodiewords(suf))
                            end
                        context.stopsubject()
                    end
                end
            end
        end
    end
end

local lpegmatch = lpeg.match

moduledata.languages.goodies.ligaturehandlers = { }

function moduledata.languages.goodies.ligatures(specification)

    specification  = interfaces.checkedspecification(specification)
    local language = specification.language
    local filename = specification.file

    if not language then
    elseif moduledata.languages.goodies.ligaturehandlers[language] then
    else
        -- fb ff ffb fff ffh ffi ffj ffk ffl fft fi fk fl ft
        local list    = specification.list or "ff fi fl ffi fff ffl"
        local hash    = table.tohash(lpeg.split(" ",list)) -- also strip
        local pattern = (1-lpeg.utfchartabletopattern(hash))^1 * lpeg.P(-1)
        local checked = { }

        moduledata.languages.goodies.ligaturehandlers[language] = function(original)
            if not checked[original] and not lpegmatch(pattern,original) then
                checked[original] = true
            end
            return original
        end

        languages.installhandler(language,"moduledata.languages.goodies.ligaturehandlers." .. language .. "")

        statistics.register(string.formatters["'% t' ligatures checked for language %a"](table.sortedkeys(hash), language), function()
            return next(checked) and table.concat(table.sortedkeys(checked)," ") or nil
        end)

        local applied = languages.appliedoptions[language]

        trackers.enable("languages.applied")

        if applied then
            statistics.register(string.formatters["options applied for language %a"](language), function()
                return next(applied) and table.concat(table.sortedkeys(applied)," ") or nil
            end)
            statistics.register(string.formatters["missed ligatures for language %a"](language), function()
                for k, v in next, applied do
                    checked[k] = nil
                end
                for k, v in next, hash do
                    checked[k] = nil
                end
                return next(checked) and table.concat(table.sortedkeys(checked)," ") or nil
            end)
         end

    end

end
