%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\showmathfontcharacters
  {\dodoubleempty\doshowmathfontcharacters}

\def\doshowmathfontcharacters[#1][#2]%
  {\begingroup
   \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: \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\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
function document.showmathfont(id,slot)
    local data = characters.data
    local tfmdata = fonts.ids[id]
    local characters = tfmdata.characters
    local sorted = (slot and { slot }) or table.sortedkeys(characters)
    local function report(...)
        tex.sprint(tex.ctxcatcodes,string.format(...))
    end
    for _, s in next, sorted do
        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
            report("\\startmathfontlistentry")
            report("\\mathfontlistentryhexdectit{U+%05X}{%s}{%s}",s,s,string.lower(info.description or "no description, private to font"))
            report("\\mathfontlistentrywdhtdpic{%s}{%s}{%s}{%s}",char.width or 0,char.height or 0,char.depth or 0,char.italic or 0)
            if info.mathclass then
                report("\\mathfontlistentryclassname{%s}{%s}",info.mathclass,info.mathname or "no name")
            end
            if info.mathspec then
                for i=1,#info.mathspec do
                    report("\\mathfontlistentryclassname{%s}{%s}",info.mathspec[i].class,info.mathspec[i].name or "no name")
                end
            end
            if info.mathsymbol then
                report("\\mathfontlistentrysymbol{U+%05X}{%s}",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] = string.format("\\mathfontlistentrynext{U+%05X}{%s}",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] = string.format("\\fontlistentryvariants{U+%05X}{%s}",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] = string.format("\\fontlistentryvariants{%s}",v.glyph)
                end
                choriz_variants = t
            end
            local cvariants = choriz_variants or cvert_variants
            if cvariants and cnext then
                report("\\mathfontlistentrynextvariantslist{%s}{%s}",table.concat(cnext," => "),table.concat(cvariants," => "))
            else
                if cnext then
                    report("\\mathfontlistentrynextlist{%s}",table.concat(cnext," => "))
                end
                if variants then
                    report("\\mathfontlistentryvariantslist{%s}",table.concat(cvariants," "))
                end
            end
            report("\\stopmathfontlistentry")
        end
    end
end
\stopluacode

\endinput

\startbuffer mathtest
    \begingroup\mm\mr\showmathfontcharacters\endgroup
\stopbuffer

\starttext
    \usetypescript[cambria]   \setupbodyfont[cambria,  12pt] \getbuffer[mathtest]
    \usetypescript[lmvirtual] \setupbodyfont[lmvirtual,12pt] \getbuffer[mathtest]
    \usetypescript[pxvirtual] \setupbodyfont[pxvirtual,12pt] \getbuffer[mathtest]
    \usetypescript[txvirtual] \setupbodyfont[txvirtual,12pt] \getbuffer[mathtest]
    \usetypescript[palatino]  \setupbodyfont[palatino, 10pt] \getbuffer[mathtest]
    \usetypescript[mathtimes] \setupbodyfont[mathtimes,12pt] \getbuffer[mathtest]
\stoptext

