%D \module
%D   [      file=s-fnt-25,
%D        version=2009.01.25,
%D          title=\CONTEXT\ Style File,
%D       subtitle=Math Glyph Checking,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\def\enableshowmathfontvirtual
  {\ctxlua{fonts.tfm.auto_cleanup=false}}

\def\showmathfontcharacters
  {\dodoubleempty\doshowmathfontcharacters}

\def\doshowmathfontcharacters[#1][#2]%
  {\begingroup
   \dontcomplain
   \doifelsenothing{#1}
     {\definedfont[MathRoman*math-text]}
     {\definedfont[#1]}%
   \doifelsenothing{#2}
     {\ctxlua{document.showmathfont(font.current())}}
     {\def\dodoshowmathfontcharacters##1{\ctxlua{document.showmathfont(font.current(),##1)}}%
      \processcommalist[#2]\dodoshowmathfontcharacters}%
   \endgroup}

\def\startmathfontlist
  {\startpacked}

\def\stopmathfontlist
  {\stoppacked}

\def\startmathfontlistentry
  {\blank
   \begingroup}

\def\stopmathfontlistentry
  {\endgroup
   \blank}

\def\mathfontlistentryhexdectit#1#2#3%
  {#1: \char#2\enspace\ruledhbox{\char#2}\enspace#3\par
   \advance\leftskip 1em\relax}

\def\mathfontlistentrywdhtdpic#1#2#3#4%
  {width: #1, height: #2, depth: #3, italic: #4\par}

\def\mathfontlistentryresource#1%
  {virtual: #1\par}

\def\mathfontlistentrynext#1#2%
  {#1~\ruledhbox{\char#2}}

\def\mathfontlistentrynextlist#1%
  {next: #1\par}

\def\fontlistentryvariants#1#2%
  {#1~\ruledhbox{\char#2}}

\def\mathfontlistentryvariantslist#1%
  {variants: #1\par}

\def\mathfontlistentrynextvariantslist#1#2%
  {next: #1 => variants: #2\par}

\def\mathfontlistentryclassname#1#2%
  {mathclass: #1, mathname: #2\par}

\def\mathfontlistentrysymbol#1#2%
  {mathsymbol: #1~\ruledhbox{\char#2}\par}

\startluacode
local concat = table.concat
local format, lower = string.format, string.lower

function document.showmathfont(id,slot)
    local data = characters.data
    local tfmdata = fonts.identifiers[id]
    local characters = tfmdata.characters
    local sorted = (slot and { slot }) or table.sortedkeys(characters)
    local virtual, names = tfmdata.type == "virtual", { }
    if virtual then
        for k, v in ipairs(tfmdata.fonts) do
            local name = fonts.identifiers[v.id].name
            names[k] = (name and file.basename(name)) or v.id
        end
    end
    local round = math.round
    local limited = true
    for _, s in next, sorted do
        if not limited or s < 0xF0000 then
            local char = characters[s]
            if char then
                local info = data[s]
                local cnext, cvert_variants, choriz_variants = char.next, char.vert_variants, char.horiz_variants
                context.startmathfontlistentry()
                context.mathfontlistentryhexdectit(format("U+%05X",s),s,lower(info.description or "no description, private to font"))
                context.mathfontlistentrywdhtdpic(round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0))
                if virtual then
                    local commands = char.commands
                    if commands then
                        local t = { }
                        for i=1,#commands do
                            local ci = commands[i]
                            if ci[1] == "slot" then
                                local fnt, idx = ci[2], ci[3]
                                t[#t+1] = format("%s/%0X",names[fnt] or fnt,idx)
                            end
                        end
                        if #t > 0 then
                            context.mathfontlistentryresource(concat(t,", "))
                        end
                    end
                end
                if info.mathclass then
                    context.mathfontlistentryclassname(info.mathclass,info.mathname or "no name")
                end
                if info.mathspec then
                    for i=1,#info.mathspec do
                        context.mathfontlistentryclassname(info.mathspec[i].class,info.mathspec[i].name or "no name")
                    end
                end
                if info.mathsymbol then
                    context.mathfontlistentrysymbol(format("U+%05X",info.mathsymbol),info.mathsymbol)
                end
                if cnext then
                    local t, done = { }, { }
                    while cnext do
                        if done[cnext] then
                            t[#t+1] = "CYCLE"
                            break
                        else
                            done[cnext] = true
                            t[#t+1] = context.nested.mathfontlistentrynext(format("U+%05X",cnext),cnext)
                            cnext = characters[cnext]
                            cvert_variants = cnext.vert_variants or cvert_variants
                            choriz_variants = cnext.horiz_variants or choriz_variants
                            if cnext then
                                cnext = cnext.next
                            end
                        end
                    end
                    cnext = t
                end
                if cvert_variants then
                    local t = { }
                    for k, v in next, cvert_variants do
                        t[#t+1] = context.nested.fontlistentryvariants(format("U+%05X",v.glyph),v.glyph)
                    end
                    cvert_variants = t
                end
                if choriz_variants then
                    local t = { }
                    for k, v in next, choriz_variants do
                        t[#t+1] = context.nested.fontlistentryvariants(format("U+%05X",v.glyph),v.glyph)
                    end
                    choriz_variants = t
                end
                local cvariants = choriz_variants or cvert_variants
                if cvariants and cnext then
                    context.mathfontlistentrynextvariantslist(concat(cnext," => "),concat(cvariants," => "))
                else
                    if cnext then
                        context.mathfontlistentrynextlist(concat(cnext," => "))
                    end
                    if cvariants then
                        context.mathfontlistentryvariantslist(concat(cvariants," "))
                    end
                end
                context.stopmathfontlistentry()
            end
        end
    end
end
\stopluacode

\endinput

\starttext
    \setupbodyfont[cambria,  12pt] \showmathfontcharacters
%     \setupbodyfont[lmvirtual,12pt] \showmathfontcharacters
%     \setupbodyfont[pxvirtual,12pt] \showmathfontcharacters
%     \setupbodyfont[txvirtual,12pt] \showmathfontcharacters
%     \setupbodyfont[palatino, 10pt] \showmathfontcharacters
%     \setupbodyfont[mathtimes,12pt] \showmathfontcharacters
%     \setupbodyfont[stix,     12pt] \showmathfontcharacters
%     \setupbodyfont[xits,     12pt] \showmathfontcharacters
%     \setupbodyfont[lucida,   12pt] \showmathfontcharacters
\stoptext

